捕获 iframe 加载完成事件

IT技术 javascript html iframe load dhtml
2021-02-07 12:15:31

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

6个回答

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

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

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

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

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

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

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

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

这种方法也容易受到竞争条件的影响,因为 iframe 可能会在执行脚本标记之前加载。
2021-03-16 12:15:31
谢谢,这正是我需要的!
2021-03-18 12:15:31
使用此方法,您只能在加载 iframe 时运行单个函数。请参阅下面的答案,使用addEventListener它允许在加载事件上运行多个回调。
2021-03-25 12:15:31
是的,如果 iFrame 内容不是 HTML(例如 PDF),则这在 IE 中不起作用。请参阅:connect.microsoft.com/IE/feedback/details/809377/...
2021-03-26 12:15:31
当您尝试下载文件时,加载事件不起作用。
2021-03-29 12:15:31

以上答案都不适合我,但是确实如此

更新

正如@doppleganger 在下面指出的那样,负载从 jQuery 3.0 开始就消失了,所以这里有一个使用on. 请注意,这实际上适用于 jQuery 1.7+,因此即使您尚未使用 jQuery 3.0,也可以通过这种方式实现它。

$('iframe').on('load', function() {
    // do stuff 
});
如果您使用jqueryjqLite然后这是要走的路!
2021-03-31 12:15:31
从 jQuery 3.0 开始,load已经消失了。.on('load', function() { ... })改用。
2021-04-08 12:15:31

在 vanilla JavaScript 中有另一种一致的方式(仅适用于 IE9+):

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

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

如果你对Observables感兴趣,这可以解决问题:

import { fromEvent } from 'rxjs';

const iframe = document.getElementById('iframe');

fromEvent(iframe, 'load').subscribe(() => console.log('loaded');
handleLoad()在我看到 iFrame 渲染之前,我的调试器会在我的断点处停止吗?我希望这纯粹是渲染问题而不是内容加载问题。
2021-03-19 12:15:31
当 iframe 已经存在时,如何通过 jquery 捕获该事件...即:iframe 不是由 jquery 创建的。
2021-04-10 12:15:31

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

我有一个显示的 iframe:none 但在向其发布表单后会触发 onload 事件。
2021-03-15 12:15:31
也有没有显示的 iframe ;)
2021-03-18 12:15:31

您还可以通过这种方式捕获 jquery 就绪事件:

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

这是一个工作示例:

http://jsfiddle.net/ZrFzF/

ready 在 DOM 准备好并且可以执行 js 时触发,而不是在加载内容时触发。
2021-03-12 12:15:31
它只调用了一次:(
2021-03-18 12:15:31
$("#iframeid").ready 当元素在 dom 中时触发该函数。不是当 ifram 完成加载时。
2021-03-23 12:15:31
我不认为该代码会执行您认为的操作。您可以用任何东西替换小提琴中的“#iFrame”选择器,并且警报仍然会触发
2021-04-02 12:15:31
除了@roryok 之外,当 DOM 准备好时,ready 会触发,而不是整个页面加载。
2021-04-05 12:15:31