同源 iframe 的 onload 事件可可靠标识内容就绪,跨域时可能误触发或静默失败;需先设 src 再绑事件,ie 需兼容 onreadystatechange;layer.type:2 不支持进度控制,应改用 type:1 手动管理 iframe 及 loading 状态。

iframe onload 事件只在同源时可靠触发
跨域 iframe 的 onload 事件虽然会触发,但无法确认页面是否真正加载完成——它可能在 about:blank 阶段就 fired,也可能静默失败。只有同源 iframe 才能依赖 onload 作为“内容就绪”的信号。
常见错误现象:iframe.onload = () => { console.log('loaded') } 写了却没打印,或提前打印但 iframe 内容仍是空白。
- 必须确保 src 是完整 URL(含协议),避免相对路径导致跨域误判
- 不要在
src未设置前就绑定 onload —— 先设 src,再绑事件 - IE11 及更早版本需用
iframe.onreadystatechange补充监听readyState === 'complete'
layer.open(type: 2) 不支持内置进度条,得手动接管
layer.open({ type: 2, content: 'https://xxx.com' }) 本质是 layer 自动创建并插入 iframe,你拿不到 DOM 引用,也没法监听加载过程。想加进度提示,必须放弃 type: 2。
正确做法是用 type: 1 + 手动构造 iframe:
- 先调
layer.load(2)显示转圈图标 - 再
layer.open({ type: 1, content: '<iframe src="..." id="myIframe"></iframe>' }) - 用
document.getElementById('myIframe').onload = () => layer.closeLoad() - 注意:若 iframe 跨域,
onload触发后仍无法读取contentDocument,但至少能关掉 loading 图标
想显示 0–100% 进度?浏览器不提供原生接口
没有 API 能告诉你 iframe 正在加载的字节数或百分比。所谓“进度条”,实际是模糊反馈:靠预设节点(如 DOM 加载到 、<main></main>)或定时轮询 iframe.contentDocument.readyState 来模拟。
更现实的做法是放弃精确百分比,改用状态提示:
- 加载中 → 显示 “正在连接…”
-
onload触发 → 切换为 “准备就绪” 或直接显示 iframe - 超时(如 15s 无响应)→
layer.msg('加载失败,请重试') - 别写
setInterval(() => { progress += 1 }, 100)—— 这不是真实进度,用户一眼能识破
移动端 Safari 和部分安卓 WebView 对 iframe 加载反馈极弱
Safari 会延迟触发 onload,甚至在页面已可视后才回调;某些安卓 WebView 在 iframe 内跳转后不会再次触发 onload。这意味着仅靠 onload 做 loading 状态管理,在真机上容易卡在“加载中”不动。
缓解方案:
- 加一个兜底定时器:
setTimeout(() => { if (!loaded) layer.closeLoad() }, 12000) - 对关键操作(如 iframe 内按钮可点击),改用
postMessage由子页主动通知父页“已就绪” - 避免在 iframe 里做重定向或动态
location.href修改 —— 这会让 onload 失效且无法捕获
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











