CDN加载失败时onerror的this.src切换本地JS无效,仅document.write可行
为什么修改script的src无法 fallback 到本地JS,而document.write可以?
直接修改src失效的原因
浏览器对<script>标签的加载逻辑是:当首次指定的src加载失败后,该script元素会被标记为加载失败状态,此时即使你修改它的src属性,浏览器也不会重新发起新的HTTP请求去加载新的资源。这是浏览器的内置机制,避免重复请求已判定失败的资源(哪怕目标路径已变更)。
document.write生效的原因
使用document.write时,你并不是修改原有script元素,而是在当前文档流中插入了一个全新的<script>标签。这个新的script元素未被标记为失败状态,浏览器会正常解析它的src属性并发起请求加载本地JS文件,因此能成功完成 fallback。
更推荐的替代方案
现在不推荐使用document.write(尤其是文档加载完成后使用可能会覆盖整个文档),更稳妥的方式是动态创建script元素:
<script src="cdn.js" onerror="this.onerror=null; loadLocalScript()"></script> <script> function loadLocalScript() { const script = document.createElement('script'); script.src = 'local.js'; document.head.appendChild(script); } </script>
这种方式通过创建新的script元素并插入DOM,既规避了原script元素的失败状态限制,也不会出现document.write的潜在问题。
内容的提问来源于stack exchange,提问作者Unknown
相关产品推荐
相关产品推荐

