我有一个页面
http://www.zen76171.zen.co.uk/aaa2.html
用这个 HTML
<!doctype html>
<html>
<head>
<noscript>aaa</noscript>
<script>document.write("bbb")</script>
</head>
<body>
ccc
</body>
</html>
我知道如果浏览器没有运行 javascript,noscript 标签的内容应该运行。
在 chrome 或 firefox 中,没有任何扩展阻止任何东西,我得到 bbb ccc 的输出。很好,很有道理。'bbb' 显示是因为允许使用 javascript,而 ccc 显示是因为它将显示是否启用了 javascript。
然后我尝试在 Firefox 中安装 NoScript https://addons.mozilla.org/en-GB/firefox/addon/noscript/
现在,当我重新加载我提到的页面时http://www.zen76171.zen.co.uk/aaa2.html
它显示ccc
。这向我表明脚本被阻止了,所以这部分很好。
但我期望的输出是aaa ccc
,因为我希望“aaa”在脚本被禁用时显示,并且脚本被禁用。
还有一个我要解决的次要问题,那就是如果我从 Firefox 中禁用甚至“删除”NoScript,那么我仍然会得到与“ccc”相同的响应,我必须卸载并重新安装 Firefox 才能删除 NoScript。但就目前而言,当我想删除 NoScript 时就可以了。
这个问题是:为什么它只显示'ccc'而不是'aaa ccc'?
添加
我实际上只得到了与“uBlock Origin”一起显示的“ccc”。如果我安装“uBlock Origin”,并选择保持原样而不禁用脚本,那么我会得到“bbb ccc”(很好)。而如果我单击以禁用页面上的脚本,则会得到“ccc”。'aaa' 未显示。
noscript 标签使用不当,而浏览器扩展正常工作。除此之外,页面结果可能会被缓存,因此可能需要硬刷新(使用覆盖缓存重新加载)。
使用不当
不,预期的输出 'aaa' 不会显示,因为 noscript 标签使用不当。
W3schools 上的 HTML noscript 标签对用法做了简明的解释:
换句话说,OP 使用的 noscript 标签基于 HTML5 是有效的,但不遵循HTML 标准。HTML head 元素中的 noscript 标签不应包含任何“自由文本”。
页面结果
包括 Firefox 在内的大多数浏览器默认使用缓存,因此可能需要硬刷新。这可以很容易地一直重现,除非用户以不同的方式配置了缓存行为。
差异 1:硬刷新是通过键盘快捷键执行的,对于 Firefox 可以是Ctrl+F5或Ctrl+ Shift+ R。在浏览器扩展的情况下,缓存的效果可能会持续到浏览器再次重新启动(用户体验可能会有所不同)。
包含“aaa”的 noscript 标签可能被扩展忽略或省略,因为“aaa”的用法不符合 HTML 标准。HTML head 元素中的 noscript 标签必须只包含上面提到的三个元素。
差异 2:在 Firefox 中本地查看 HTML 文件时,即使启用了 uBlock Origin 并选中了扩展选项“禁用 JavaScript”,页面结果也将是“bbb ccc”。这可能是由于对 Firefox Quantum 中的扩展程序授予的权限有限。换句话说,浏览器扩展无法阻止通过文件 URI 方案显示的本地 HTML 页面的脚本(而不是通过 Web 服务器运行的本地主机,这是另一回事)。
再试一次
考虑修改后的 HTML 内容如下:
然后使用 uBlock Origin 在 Firefox 中加载 HTML,其选项“禁用 JavaScript”未选中(OFF)或选中(ON)。
差异 3:仅当浏览器本身禁用 JavaScript 时,“aaa”才会可见(Firefox 隐藏配置,about:config - “javascript.enabled”设置为“false”)。或者,使用任何纯文本浏览器查看类似结果。这与浏览器扩展提供的选项不同,Firefox Quantum 在设计上对其进行了限制。
TL;DR在 HTML 主体元素中使用 noscript 标记,以便在禁用脚本时使文本可见。浏览器扩展根据 HTML 标准正常工作,但受设计限制。