我有一个页面
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”没有显示。
答案1
noscript 标签使用不当,而浏览器扩展程序运行正常。除此之外,页面结果可能被缓存,因此可能需要硬刷新(使用覆盖缓存重新加载)。
不当使用
但我期望的输出是“aaa ccc”,因为我希望在脚本被禁用时显示“aaa”,并且脚本也被禁用。
不,由于 noscript 标签使用不当,预期输出“aaa”将不会显示。
W3schools 上的 HTML noscript 标签提供用法的简明解释:
定义和用法[...]
<noscript> 元素可以在 <head> 和 <body> 中使用。
在 <head> 元素内部使用时: <noscript> 必须仅包含 <link>、<style> 和 <meta> 元素。
HTML 4.01 和 HTML5 之间的差异
在 HTML 4.01 中,<noscript> 标签只能在 <body> 元素内使用。
在 HTML5 中,<noscript> 标签可以在 <head> 和 <body> 内使用。
换句话说,OP 使用的 noscript 标签基于 HTML5 是有效的,但这并不符合HTML 标准. HTML head 元素中的 noscript 标签不应该包含任何“自由文本”。
页面结果
我还解决了一个次要问题,那就是如果我从 Firefox 中禁用甚至“删除”NoScript,那么我仍然会得到相同的“ccc”响应[...]
大多数浏览器(包括 Firefox)默认使用缓存,因此可能需要硬刷新。除非用户对缓存行为进行了不同的配置,否则这种情况随时都可能出现。
差异 1:硬刷新是通过键盘快捷键执行的,对于 Firefox,可以是Ctrl+F5或Ctrl+ Shift+ R。对于浏览器扩展,缓存效果可能会持续到浏览器再次重新启动(用户体验可能有所不同)。
如果我安装“uBlock Origin”,并选择保持原样,不禁用脚本,则会出现“bbb ccc”(很好)。而如果我单击页面上的禁用脚本,则会出现“ccc”。不会显示“aaa”。
包含“aaa”的 noscript 标签可能被扩展忽略或省略,因为“aaa”的用法不符合 HTML 标准。HTML head 元素中的 noscript 标签必须仅包含上述三个元素。
差异 2:即使启用了 uBlock Origin 并选中了扩展选项“禁用 JavaScript”,在 Firefox 中本地查看 HTML 文件时,页面结果也将是“bbb ccc”。这可能是由于 Firefox Quantum 中扩展的权限有限。换句话说,浏览器扩展无法阻止通过以下方式显示的本地 HTML 页面的脚本文件 URI 方案(不是通过 Web 服务器运行的本地主机,这是另一回事)。
再试一次
考虑修改后的 HTML 内容如下:
<!doctype html>
<html>
<head>
<noscript>aaa<style>#this {color:#cccccc;}</style></noscript>
<script>document.write("bbb")</script>
</head>
<body>
<noscript>nnn</noscript>
<span id="this">ccc</span>
</body>
</html>
然后使用 uBlock Origin 在 Firefox 中加载 HTML,并且其选项“禁用 JavaScript”处于未选中(OFF)或选中(ON)的状态。
- 如果“禁用 JavaScript”处于关闭状态,则结果将是“bbb ccc”
- 如果“禁用 JavaScript”处于开启状态,则结果将为“nnn ccc”,其中“nnn”从 HTML body 元素中的 noscript 标签显示,而“ccc”从 HTML head 元素中的 noscript 标签继承颜色
- 在这两种情况下,“aaa”都不会出现,如前所述(不符合标准)
差异 3:仅当浏览器本身禁用 JavaScript 时(Firefox 隐藏配置,about:config - “javascript.enabled”设置为“false”),才会显示“aaa”。或者,使用任何纯文本浏览器都可以看到类似的结果。这与浏览器扩展提供的选项不同,Firefox Quantum 已限制该选项通过设计。
总结在 HTML body 元素中使用 noscript 标签,以便在禁用脚本时使文本可见。浏览器扩展程序根据 HTML 标准正常运行,但受到设计限制。