最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
HTML怎么做defer加载_html script defer延迟加载方法一文搞懂
时间:2026-06-05 10:06:59 编辑:袖梨 来源:一聚教程网
defer仅对带src的外部脚本生效,执行时机固定在DOM构建完成、DOMContentLoaded之前,按HTML顺序执行,不支持内联脚本,混用async会忽略defer,且无法拦截运行时错误。
defer 不是“加了就自动延迟执行”的万能开关,它只对带 src 的外部脚本生效,且执行时机严格固定在 DOM 构建完成、DOMContentLoaded 之前——这意味着你能在脚本里直接操作 document.body 或 document.getElementById,但不能指望它等图片或 CSS 加载完。
defer 只对外部脚本(src)有效
浏览器会完全忽略内联脚本上的 defer 属性,既不报错也不延迟:
- ❌
<script defer>init();</script>——init()会在 HTML 解析到此处时立即执行(等同于无属性) - ✅
<script src="main.js" defer></script>—— 下载异步,执行推迟到 DOM 就绪后 - ⚠️
<script src="utils.js" defer="false"></script>——defer是布尔属性,赋值会被忽略,实际仍生效
多个 defer 脚本按 HTML 顺序执行,但依赖链必须写对
执行顺序保序 ≠ 加载顺序保序,更不等于逻辑依赖自动满足。如果 app.js 依赖 lodash.js,但 HTML 中 app.js 写在前面,就会报 ReferenceError: _ is not defined:
- ✅ 正确顺序:
<script src="lodash.js" defer></script>→<script src="app.js" defer></script> - ❌ 错误顺序:
<script src="app.js" defer></script>→<script src="lodash.js" defer></script> - ⚠️ 混用
async和defer:浏览器以async为准,defer被静默丢弃,执行可能穿插进 defer 队列中间
defer 脚本里不能用 document.write
哪怕 DOM 已就绪,document.write 在 defer 脚本中也会被浏览器直接忽略,或触发严重错误(如清空整个页面),现代代码基本不用,但老项目迁移时容易踩坑:
立即学习“前端免费学习笔记(深入)”;
- ❌
<script src="legacy.js" defer></script>中含document.write('<div>...</div>')→ 页面异常或控制台报错 - ✅ 替代方案:用
document.body.insertAdjacentHTML或document.createElement+appendChild - ⚠️ 注意:服务端注入的初始化数据(如
window.__INITIAL_STATE__)必须放在所有defer脚本之前,且自身不能加defer,否则defer脚本读不到
真正容易被忽略的是:defer 只管“什么时候执行”,不管“执行成不成”。路径 404、CSP 阻断、模块内部动态 import() 失败,都不会被 defer 拦住或重试——这些得靠运行时错误捕获和 fallback 逻辑兜底。
相关文章
- 伊莫星骑士支线任务如何完成 06-16
- 逆战未来深渊狂潮怎么玩 06-16
- 银河灰暗角落结局彩蛋触发方法分享 06-16
- 异能重组护盾流玩法攻略介绍说明 06-16
- 别拽了烤串师傅气味炸弹成就解锁攻略 06-16
- 银河灰暗角落暴击流玩法构筑分享 06-16