很多人加了 <noscript><p>请启用 JavaScript</p></noscript> 却发现页面从不显示它——根本原因在于:<noscript> 不响应脚本 404、CSP 拦截、fetch 报错、React hydrate 崩溃,甚至 IE11 渲染失败。它只认一个信号:浏览器底层 JS 引擎是否关闭(如 javascript.enabled === false)。Chrome 设置里关掉 JS 才真触发;DevTools 里临时禁用后必须刷新页面才生效。
<noscript> 在 <head> 中只能放 <meta>、<link>、<style>;放 <p> 或 <button> 会被浏览器忽略,用户完全看不到。正确写法是直接塞进 <body>,最好紧贴它所替代的功能区块:
<div id="interactive-map"></div><noscript> <section aria-label="地图(JavaScript 已禁用)"> <h3>门店地址</h3> <p>北京市朝阳区建国路88号</p> <a href="https://www.google.com/maps?q=北京市朝阳区建国路88号">在 Google 地图中查看</a> </section></noscript>
<div> 里,否则无效aria-label,方便屏幕阅读器识别这是降级内容<a href>,不能靠 JS 绑定跳转只写“请启用 JavaScript”等于放弃用户。真正有用的降级内容得让用户继续完成核心任务:
<form method="post" action="/login">,而不是依赖 fetch() 的无刷新提交data:image/svg+xml;base64,...,避免 JS 禁用时 /assets/logo.svg 404<noscript> 里写 <style> —— 它可能被解析但不生效像 Create React App 默认输出的空 <body>,JS 一禁就是白屏,<noscript> 根本没机会解析或展示。它只在服务端生成首屏 HTML(SSR/SSG)的前提下才有效,比如 Next.js、Nuxt 默认行为。现代构建工具打包后还容易把相对路径资源(如图片、字体)搞成 404,所以:
立即学习“Java免费学习笔记(深入)”;
<noscript> 就能兜住所有问题<noscript> 补救最常被忽略的一点:它不解决兼容性问题。IE11 不支持 <dialog>?<noscript> 不管这事。检测新标签得用特性判断,比如 typeof HTMLDialogElement !== 'function',再配 JS 动态降级。