在javascript或jQuery中检测iframe的负载(不是同一个域,动态添加)?

Posted

技术标签:

【中文标题】在javascript或jQuery中检测iframe的负载(不是同一个域,动态添加)?【英文标题】:Detect load of iframe (not same domain, dynamically added) in javascript or jQuery? 【发布时间】:2017-06-12 13:47:00 【问题描述】:

有没有办法检测何时在 javascript / jQuery 中加载 iframe?满足以下条件:

我无法控制 iframe。它是由另一个 javascript 插件添加的。 它指向另一个域(所以我想我不能使用相同域的解决方案)。 我不知道加载 iframe 的时间。我只是可以设置一个时间间隔并检查每次是否有 iframe 并尝试调用他的加载事件(因此 iframe 会动态添加到 DOM)

我在其他问题中读到过这一点,但它们要么不完整,要么不假设这三个条件。

提前致谢。

补充@Jaromanda X: 我需要在observer.observe(document.body, childList: true ); 中为这个答案添加一个选项,实际上是这样的:observer.observe(document.body, childList: true, subtree: true );子树选项也适用于目标的所有后代(本例为 document.body)。

【问题讨论】:

Mutation Observer 至少可以帮助检测何时创建 iframe 元素 - 然后您可以像往常一样向 iframe 添加加载事件侦听器... 【参考方案1】:

使用突变观察器来检测何时将 iframe 添加到 DOM,然后您只需添加一个 load 事件侦听器即可检测 iframe 何时加载

var observer = new MutationObserver(function (mutations) 
    mutations.forEach(function (mutation) 
        [].filter.call(mutation.addedNodes, function (node) 
            return node.nodeName == 'IFRAME';
        ).forEach(function (node) 
            node.addEventListener('load', function (e) 
                console.log('loaded', node.src);
            );
        );
    );
);
observer.observe(document.body,  childList: true, subtree: true );

【讨论】:

谢谢,效果很好!只是为了记录,我需要在observer.observe(document.body, childList: true ); 中为这个答案添加一个选项,实际上是:observer.observe(document.body, childList: true, subtree: true );。子树选项也适用于目标的所有后代(本例为 document.body)。 你是对的 - 我在我使用的 MutationObserver 代码中有它(不是用于 iframe,用于其他东西)不知道我是如何错误地复制它的!我会把它添加到答案中 不幸的是,这个解决方案在 android WebView(基于 webkit)中不起作用。

以上是关于在javascript或jQuery中检测iframe的负载(不是同一个域,动态添加)?的主要内容,如果未能解决你的问题,请参考以下文章

检测 <td> 的内部 html 何时随 javascript 或 jquery 更改

Javascript/jquery:如何检测在其他窗口或应用链接中加载的页面?

jQuery/JavaScript:检测滚动方向 - 代码结构问题

JavaScript 或 jQuery 浏览器后退按钮点击检测器

使用 javascript 或 jQuery 检测用户是不是拒绝浏览器定位计算机的请求

非活动选项卡中的 Javascript/Jquery 计时错误