捕获iframe加载完成事件


Answers:


197

<iframe>元素为此有一个load事件


如何收听该事件取决于您,但是通常最好的方法是:

1)以编程方式创建iframe

通过确保在iframe开始加载之前load附加监听器,可以确保始终调用该监听器。

<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>

2)内联javascript,是您可以在HTML标记内使用的另一种方法。

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

<iframe id="myframe" src="..." onload="onMyFrameLoad(this)"></iframe>

3)您也可以将事件侦听器附加在标记内的元素之后<script>,但请记住,在这种情况下,在添加侦听器时,iframe可能已经被加载了。因此,有可能它不会被调用(例如,如果iframe非常快或来自缓存)。

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

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

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


2
谢谢,这正是我需要的!
Jaime Garcia'7

1
使用这种方法,只有在加载iframe时才能运行一个函数。请参阅下面的答案,使用addEventListener它可以在load事件上运行多个回调。
2015年

1
这种方法也容易受到竞争条件的影响,因为iframe可能会在执行脚本代码之前加载。
2015年

7
当您尝试下载文件时,load事件不起作用。
杰里2015年

1
是的,如果iFrame内容不是HTML(例如PDF),则在IE中不起作用。看到这个:connect.microsoft.com/IE/feedback/details/809377/…–
谢尔盖·古萨克

27

上面的答案都不对我有用,但这确实

更新

正如@doppleganger在下面指出的那样,自jQuery 3.0起,负载就消失了,因此这是使用的更新版本on。请注意,这实际上可以在jQuery 1.7+上使用,因此即使您尚未使用jQuery 3.0,也可以通过这种方式实现。

$('iframe').on('load', function() {
    // do stuff 
});

1
从jQuery 3.0开始,load它已经不复存在。请.on('load', function() { ... })改用。
Doppelganger

如果您使用jqueryjqLite则这是要走的路!
彼得

11

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

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

iframe.addEventListener('load', handleLoad, true)

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

return Observable.fromEventPattern(
  handler => iframe.addEventListener('load', handler, true),
  handler => iframe.removeEventListener('load', handler)
);

是否担心我的调试器在handleLoad()看到iFrame渲染之前停止在断点处?我希望这纯粹是渲染问题,而不是内容加载问题。
Sridhar Sarnobat

当iframe已经存在时,如何通过jquery捕获该事件...即:iframe不是jquery创建的。
gumuruh

3

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


2
也与无显示的iframe一起使用;)
Felipe N Moura

1

您还可以通过以下方式捕获jquery ready事件:

$('#iframeid').ready(function () {
//Everything you need.
});

这是一个工作示例:

http://jsfiddle.net/ZrFzF/


16
我认为代码没有实现您认为的功能。您可以用任何东西替换小提琴中的“ #iFrame”选择器,并且警报仍会触发
roryok

6
除了@roryok之外,在DOM准备就绪时也会触发ready触发,而不是整个页面加载。
伊凡·尼基丁

1
当DOM准备就绪并且可以执行js时(而不是在加载内容时)会触发ready。
谢尔盖·古萨克

2
当元素位于dom中时,$(“#iframeid”)。ready会触发函数。如果ifram完成加载,则不会。
Popsyjunior

它只叫过一次:(
侯赛因·巴德涅扎德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.