我动态创建了一个iframe,发现这个iframe触发了两次onload事件。
var i=0;
frameOnload=function(){
console.log(i++);
};
var ifr=document.createElement("iframe");
ifr.src="javascript:(function(){document.open();document.write('test');document.close();})();";
ifr.onload=frameOnload;
document.body.appendChild(ifr);
为什么我最后是1?
如何防止iframe的onload两次,而不是将onload函数指向自身内部的null?
8条答案
按热度按时间nfs0ujit1#
我也遇到过同样的问题,但没有得到任何答案,所以我自己测试.
在webkit浏览器(safari/chrome)中,如果在iframe附加到主体之前附加onload事件,则iframe onload事件将触发两次。
因此,您可以通过以下方式更改代码来防止iframe onload两次。
然后,您将只获得一个onload事件,这是文档真正加载的事件。
d8tt03nd2#
下面是得票最多的答案:* 如果您无法控制何时以及如何将内容附加到DOM--例如,当使用框架时 (我们在Angular应用程序中遇到过这种情况)-- 您可能需要尝试下面的解决方案。*
我做了大量的跨浏览器测试,发现了以下变通方案:* * 检查传递给
onload
回调的参数,并在事件侦听器中检查evt.target.src
。**(if如果你从HTML调用全局方法,记得在HTML标记中传递
event
:<iframe onload="window.globalOnLoad(event)">
)evt.target.src
可以是''
(空字符串),只有在webkit中的第一个onload
调用,从我的测试。* 不同情况下iframe加载行为的研究 *
带常规URL的iframe加载行为
404 URL的iframe加载行为
iframe加载行为,URL不可解析(在DNS级别)
iframe加载行为,其中
iframe.src
在追加到DOM之前显式设置为about:blank
iframe加载行为,其中
iframe.src
在追加到DOM之前显式设置为javascript表达式epfja78i3#
异步加载的样式表也遇到过这种情况,比如下面这个。
我发现最简单的解决方案是让事件自己删除:
wko9yo5t4#
顺便说一句,当
iframe.src
是javascript:
时,我可以重新生成两个onload
,但是不能用普通的HTTP URL重新生成(onload只发生一次)。然而,当您更改调用顺序,使iframe.src
在附加到body之后设置时,就会发生双重加载(同样,仅限于webkit):当我在追加之前赋值
src
时,我得到一个onload
调用。mcdcgff05#
这里的代码工作得很好!
署名:@戴夫·斯托利https://coderanch.com/t/443223/languages/Frames-loading-refresh
dbf7pr2w6#
基于@jakub.g的回答:
在框架内部,
evt.target.src
hack不起作用,但是我发现我可以检查evt.target.title
,第二次DOMContentLoaded
被触发时,evt.target
指向正在加载的文档,所以下面的代码可以起作用:即使在InternetExplorer中,这种行为似乎也是一致的(保存没有
.addEventListener
的旧版本pes8fvy97#
我在vue.js 2.6.12中遇到过这个问题
我通过检查event.target.url是否与iframe的onload函数中的srcurl匹配来处理它。
gkl3eglg8#