捕获iframe加载完成事件

Jai*_*cia 118 html javascript iframe load dhtml

有没有办法捕获iframe的内容何时从父页面完全加载?

gbl*_*zex 171

<iframe>元素有一个load事件.


你如何倾听这一事件取决于你,但通常最好的方法是:

1)以编程方式创建iframe

它确保load始终通过在iframe开始加载之前附加它来调用您的侦听器.

<script>
var iframe = document.createElement('iframe');
iframe.onload = function() { alert('myframe is loaded'); }; // before setting 'src'
iframe.src = '...'; 
document.body.appendChild(iframe); // add it to wherever you need it in the document
</script>
Run Code Online (Sandbox Code Playgroud)

2)内联javascript,是你可以在HTML标记中使用的另一种方式.

<script>
function onMyFrameLoad() {
  alert('myframe is loaded');
};
</script>

<iframe id="myframe" src="..." onload="onMyFrameLoad(this)"></iframe>
Run Code Online (Sandbox Code Playgroud)

3)您还可以在元素内部的<script>标记内附加事件监听器,但请记住,在这种情况下,在添加监听器时,iframe的可能性很小.因此,它可能不会被调用(例如,如果iframe非常快,或来自缓存).

<iframe id="myframe" src="..."></iframe>

<script>
document.getElementById('myframe').onload = function() {
  alert('myframe is loaded');
};
</script>
Run Code Online (Sandbox Code Playgroud)

另请参阅我的其他答案,了解哪些元素也可以触发此类load事件

  • 尝试下载文件时,加载事件不起作用. (7认同)
  • 谢谢,这正是我所需要的! (2认同)
  • 这种方法也容易受到竞争条件的影响,因为 iframe 可能会在脚本标记执行之前加载。 (2认同)
  • 我找不到“iframe”元素的“load”事件的引用。MDN 仅列出了“Window”和“XMLHttpRequest”的“load”事件。任何人都可以发布真实参考的链接吗?我只在 [W3C 规范](https://www.w3.org/html/wg/spec/the-if​​rame-element.html) 中找到了对该事件的提及 (2认同)

ror*_*yok 25

上述答案都不适合我,但是这样做了

更新:

正如@doppleganger在下面指出的那样,从jQuery 3.0开始,加载就消失了,所以这里是一个使用的更新版本on.请注意,这实际上可以在jQuery 1.7+上运行,因此即使你还没有使用jQuery 3.0,你也可以通过这种方式实现它.

$('iframe').on('load', function() {
    // do stuff 
});
Run Code Online (Sandbox Code Playgroud)

  • 从 jQuery 3.0 开始,“load”已经消失了。请改用 `.on('load', function() { ... })`。 (2认同)

ait*_*j93 7

香草JavaScript中还有另一种一致的方式(仅适用于IE9 +):

const iframe = document.getElementById('iframe');
const handleLoad = () => console.log('loaded');

iframe.addEventListener('load', handleLoad, true)
Run Code Online (Sandbox Code Playgroud)

而且,如果您对Observables感兴趣,那么就可以做到:

return Observable.fromEventPattern(
  handler => iframe.addEventListener('load', handler, true),
  handler => iframe.removeEventListener('load', handler)
);
Run Code Online (Sandbox Code Playgroud)


Ken*_*ano 5

请注意,如果在屏幕外加载 iframe,则 onload 事件似乎不会触发。使用“在新窗口中打开”/w 选项卡时经常会发生这种情况。

  • 也适用于没有显示的 iframe;) (5认同)