IE9完全不支持async且defer仅对内联脚本有效;应改用动态创建script元素并链式处理onload回调来确保加载顺序。

不一致,IE9 中 async 被完全忽略,defer 行为也存在关键缺陷。
IE9 完全不支持 async 属性
IE9 及更早版本将 async 视为未知 HTML 属性,既不报错也不执行异步加载逻辑。所有带 async 的 <script> 标签退化为同步阻塞加载,和没加该属性一样。
- 即使你写成
<script async src="a.js"></script>,IE9 仍会等它下载并执行完才继续解析 DOM - 无法通过特性检测(如
"async" in document.createElement("script"))在 IE9 中可靠判断——返回false,但你不能据此安全降级,因为defer本身也不健全 - 现代打包工具(如 Webpack)若未配置 IE9 兼容模式,可能直接输出
async,导致老浏览器加载卡顿
defer 在 IE9 中只对内联脚本“伪生效”
IE9 支持 defer 语法,但仅当 <script defer> 是内联脚本(即含 <script defer>...</script>)时,才会延迟到 DOM 解析完成后执行;而对 src 外链脚本,defer 实际无效——它仍按出现顺序同步下载并执行。
- 错误写法:
<script defer src="b.js"></script>→ IE9 立即下载并执行,不延迟 - 看似可行但不可靠的写法:
<script defer>loadScript("b.js");</script>→ 延迟执行,但loadScript需手动实现,且无法保证依赖顺序 - DOMContentLoaded 事件在 IE9 中可用,但
defer外链脚本可能已提前执行或尚未触发,导致事件监听器注册时机混乱
兼容 IE9 的实际替代方案
必须放弃 async/defer 语义,改用显式控制逻辑。核心原则:外链脚本全部动态注入,并按需管理执行顺序。
- 把所有
src脚本移出 HTML,统一用document.createElement("script")创建,设置src后 append 到head或body - 需要顺序执行时,链式处理
onload回调,例如:加载完a.js再创建b.js的<script> - 避免在
DOMContentLoaded里批量注入多个脚本——IE9 下事件触发时机与脚本加载完成无强关联,容易漏掉依赖 - 如果使用 RequireJS 或 SeaJS 这类 AMD 加载器,确认其 IE9 兼容版本(如 RequireJS 2.1.x),它们内部已绕过原生属性缺陷
IE9 对脚本加载属性的支持是「有语法、无语义」:能解析 defer 字样,但不保证行为;async 则彻底隐身。真正跨浏览器可控的加载逻辑,只能靠 JS 动态创建 + 事件驱动,而不是依赖 HTML 属性。这点在维护遗留系统时尤其容易被忽略——看着标签写了 defer 就以为安全了,结果在 IE9 里还是阻塞。

















