必须先绑定onload事件再设置src,否则因加载过快易丢失;同域可靠,跨域仅表示容器就绪;display:none会静默丢弃事件;ie8需attachevent+readystatechange兜底。

iframe.onload 事件在现代浏览器中基本可用,但顺序和兼容性必须严格控制
直接给 iframe 元素赋值 src 后再绑定 onload,在 Chrome/Firefox/Safari 中大概率失效——因为加载可能已在绑定前完成。关键不是“有没有事件”,而是“有没有机会监听到”。
- 必须先绑定
onload(或addEventListener("load", ...)),再设置src - 若
iframe.readyState已是"complete"或"interactive",需立即手动触发回调 - IE8 及更老版本不支持动态修改
src后的onload触发,必须用attachEvent("onload", ...) -
addEventListener("load", handler, {once: true})是推荐写法,避免重复执行
display: none 的 iframe 会静默丢弃 onload 事件
哪怕你按正确顺序绑定了 onload,只要 iframe 的 style.display === "none",多数浏览器(包括 Chrome 120+)就不会触发该事件。这不是 bug,是规范行为:不可见资源的加载完成状态不被暴露。
- 临时方案:设为
visibility: hidden或opacity: 0替代display: none - 真正隐藏时,可先移出 DOM,加载完成后再插入并设
display: none - 若必须用
display: none,改用readystatechange监听readyState === "complete"(兼容性更好,但非标准)
动态创建 iframe 时,跨域与同域对 onload 的影响完全不同
同域下 onload 可靠;跨域下它只表示 iframe 元素本身已加载(即 <iframe></iframe> 标签解析完毕、HTTP 响应头到达),**不代表子页面 DOM 加载完成或可访问**。这是最容易误判的点。
- 同域:可安全读取
iframe.contentDocument或调用iframe.contentWindow方法 - 跨域:
onload触发后访问contentDocument会抛出 SecurityError,只能监听子页主动发来的postMessage - 不要依赖
onload判断跨域 iframe 内容是否“可用”,它只代表 iframe 容器就绪
IE8– 和旧版 Android WebView 需要 polyfill 式 fallback
IE8 不支持 addEventListener,且动态改 src 后 onload 失效;某些 Android 4.x WebView 也不触发 load 事件。不能只靠一个事件监听。
- 优先用
attachEvent("onload", handler)覆盖 IE8– - 补充监听
readystatechange,检查iframe.readyState === "complete" - 兜底用
setTimeout轮询(间隔 50ms,超时 5s 后放弃),仅用于极旧环境 - 注意:
readystatechange在现代浏览器中也存在,但行为不稳定,仅作 fallback
onload 并不等于“子页面 DOM 就绪”**,尤其在跨域或使用 sandbox 属性时,它只是 iframe 元素层级的加载信号。真要等子页内容可用,同域用 contentWindow.addEventListener("DOMContentLoaded", ...),跨域只能靠子页主动 postMessage。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











