扩展投票率最高的答案:如果您无法控制将事物附加到 DOM 的时间和方式——例如,在使用框架时(我们在我们的 Angular 应用程序)--您可能想尝试以下解决方案。
我进行了繁重的跨浏览器测试,发现了以下解决方法:检查传递给onload 回调的参数并在事件监听器中检查evt.target.src。
iframe.onload = function(evt) {
if (evt.target.src != '') {
// do stuff
}
}
(如果您从 HTML 调用全局方法,请记住在您的 HTML 标记中传递 event:<iframe onload="window.globalOnLoad(event)">)
evt.target.src 在我的测试中只能在第一个 onload 调用中的 webkit 中为 ''(空字符串)。
不同情况下 iframe 加载行为的研究
iframe.onload = function(evt){
console.log("frameOnload", ++i);
console.log("src = '" + evt.target.src + "'");
};
使用常规 URL 的 iframe 加载行为
// Chrome: onload 1 src='', onload 2 src=requestedSrc
// IE11: onload 1 src=requestedSrc
// Firefox: onload 1 src=requestedSrc
document.body.appendChild(iframe);
iframe.src = "http://www.example.org/";
带有 404 URL 的 iframe 加载行为
// Chrome: onload 1 src='', onload 2 src=requestedSrc
// IE11: onload 1 src=requestedSrc
// Firefox: onload 1 src=requestedSrc
document.body.appendChild(iframe);
iframe.src = "http://www.example.org/404";
具有不可解析(在 DNS 级别)URL 的 iframe 加载行为
// Chrome: onload 1 src='', onload 2 src=requestedSrc
// IE11: onload 1 src=requestedSrc
// Firefox: onload NEVER triggered!
document.body.appendChild(iframe);
iframe.src= 'http://aaaaaaaaaaaaaaaaaaaaaa.example/';
在附加到 DOM 之前将 iframe.src 显式设置为 about:blank 的 iframe 加载行为
// Chrome: onload 1 src='about:blank', onload 2 src=requestedSrc
// IE11: onload 1 src=requestedSrc
// Firefox: onload 1 src=requestedSrc
iframe.src = "about:blank";
document.body.appendChild(iframe);
iframe.src = "http://www.example.org/";
在附加到 DOM 之前,iframe.src 显式设置为 javascript 表达式的 iframe 加载行为
// Chrome: onload 1 src='javascript:void 0', onload 2 src=requestedSrc
// IE11: onload 1 src=requestedSrc
// Firefox: onload 1 src=requestedSrc
iframe.src = "javascript:void 0";
document.body.appendChild(iframe);
iframe.src = "http://www.example.org/";