作为陷阱的<noscript>元素
摘要
本文讨论了<noscript>HTML元素的局限性:它仅在JavaScript完全禁用时提供后备内容,而不会在JavaScript因其他原因失败时提供。文章建议改用DOM API动态更新内容。
<p><a href="https://lobste.rs/s/26xxyq/noscript_element_as_trap">评论</a></p>
查看缓存全文
缓存时间: 2026/05/14 16:32
# 那个元素是一个陷阱 来源:https://hacktivis.me/articles/no-noscript-element
Web 中为数不多的陷阱之一是 `<noscript>` 元素无法提供正确的行为。
定义:`<noscript>` 元素在 JavaScript 完全关闭或完全不支持时提供备选内容。
来源:
- HTML4 § 18.3.1 `<noscript>元素 (NOSCRIPT element)` (https://www.w3.org/TR/html4/interact/scripts.html#h-18.3.1) —— 其中提到忽略非 JavaScript 内容(W3C 以 Tcl 为例,我更倾向于指出 JScript 和 VBScript,值得庆幸的是它们都已消失)
- WHATWG HTML(多页版)§ `<noscript>元素 (the noscript element)` (https://html.spec.whatwg.org/multipage/scripting.html#the-noscript-element)
要实现正确行为,关键在于编写一个通用文本元素,通过你自己的脚本使用 DOM API 进行更新/删除。你也可以让脚本变得如此可选,以至于无需提供失败消息,但当页面实际需要脚本才能正常使用时,这并非正确方法。
需要注意的是,WHATWG HTML 中包含了一条类似于后一种方法的建议:
> `<noscript>` 元素是一种粗暴的工具。有时脚本可能已启用,但由于某种原因页面脚本可能失败。因此,通常最好避免使用 `<noscript>`,而是设计脚本使页面从无脚本状态动态转变为有脚本状态,\[...\]
问题在于,JavaScript 可能以多种方式加载失败。以下是部分情况(非完全清单):
- 域名/URL 被拦截,例如广告拦截器/杀毒软件或企业防火墙
- 浏览器/用户被拦截,例如主机端防火墙(在 IP/TCP/HTTP/... 任意封装层级),可能出于合法、过度严格或意外原因
- 基本连接问题,例如使用移动数据浏览是常态,HTTPS 配置仍会定期出现过期证书,BGP/DNS/... 仍会失败
- 不支持的 API 甚至语言语法,可能是浏览器不支持前沿特性或不可移植特性
- 网站备份恢复不当或不完整
- 网站更新部署不当,例如 HTML 在 JavaScript 之前更新,甚至部署不完整
- 托管基础设施部分宕机或过载
- 托管方的限制,例如速率限制或总带宽限制
我定期遇到上述大部分情况,大约每周几次到每月几次,而且我浏览的往往是简单网站。这还不算脚本自身处理错误的各种失败方式。
相似文章
简单HTML的超凡有效性
一篇博文,论证了简单HTML对于普遍可访问性的持续重要性,并通过一位女性使用PSP浏览器访问政府服务的故事加以说明。
CSS:不可避免的坏部分
一位非Web开发者的个人博客文章讨论了CSS中不可避免的坏部分,包括布局难题、浏览器默认设置和过度使用包装器,同时强调了可处理简单任务的子集。
不久我们就能终于将 JavaScript 放逐至 ShadowRealm
本文探讨了 TC39 提出的 ShadowRealm 提案,该提案旨在允许在不使用 iframe 或 Web Workers 的情况下,在隔离环境(Realm)中执行 JavaScript,从而改善代码沙盒机制并提升性能。
不要自己造轮子…
作者将“不要自己造轮子”的原则扩展到Web开发领域,反对自定义实现滚动、链接导航、文本选择等浏览器原生行为。
避免在RSS中使用"<![CDATA[]]>"
本文认为,在RSS/Atom feed中使用CDATA区段存在问题,因为需要对']]>'序列进行特殊转义,建议改用标准XML转义以确保简单性和统一性。