扩展投票最多的答案:如果您无法控制将事物附加到 DOM 的时间和方式——例如,在使用框架时(我们在 Angular 应用程序中发生了这种情况)——您可能想要尝试以下解决方案。
我进行了繁重的跨浏览器测试,发现了以下解决方法:检查传递给onload
回调的参数并evt.target.src
在事件侦听器中进行检查。
iframe.onload = function(evt) {
if (evt.target.src != '') {
// do stuff
}
}
(如果您从 HTML 调用全局方法,请记住传入event
您的 HTML 标记<iframe onload="window.globalOnLoad(event)">
:)
evt.target.src
根据我的测试,在第一次调用''
中只能在 webkit 中是(空字符串)。onload
不同情况下 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
显式设置为的iframe 加载行为about:blank
// 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/";
iframe.src
在附加到 DOM 之前显式设置为 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/";