检测iframe何时开始加载新URL

时间:2013-06-26 08:22:52

标签: javascript jquery events iframe

如何在我的网页上启动检测到iframe加载新页面?

我们的情况是:

  • 当iFrame内容开始变化时,我们需要显示一个" loading"动画并隐藏搜索框。
  • 我知道如何处理" iframe已经完成加载"事件(隐藏动画)但不是如何捕捉初始"开始改变"事件...

注意: 我可以附上jquery"点击"挂钩菜单上的链接,这将工作。但是,在iframe内容中有许多交叉引用链接,并且"更改"事件也适用于他们!因此,当用户点击iframe内的链接 iframe src通过javascript更改时,我们需要捕获事件 - 因为我们还想显示加载动画和隐藏搜索框。

4 个答案:

答案 0 :(得分:24)

如果iframe和容器页面是相同的原点,我找到了一个更好的解决方案,不必将额外的代码放入内页:

<iframe src="same-origin.com" onload="content_finished_loading(this)"></iframe>
<script>
    var indicator = document.querySelector('.loading-indicator');
    var content_start_loading = function() {
        indicator.style.display = 'block';
    };

    var content_finished_loading = function(iframe) {
        indicator.style.display = 'none';
        // inject the start loading handler when content finished loading
        iframe.contentWindow.onunload = content_start_loading;
    };
</script>

答案 1 :(得分:23)

我提出了以下解决方案 - 这是唯一可行的,因为我们控制了iframe内容和主机窗口的内容

在iframe中我们将以下脚本添加到页脚(所有页面都使用相同的模板,因此这是对单个文件的更改)

<script>
window.onunload = function() {
    // Notify top window of the unload event
    window.top.postMessage('iframe_change', '*');
};
</script>

在主机窗口中,我们添加此脚本以监控iframe状态

function init_content_monitor() {
    var content = jQuery('.iframe');

    // The user did navigate away from the currently displayed iframe page. Show an animation
    var content_start_loading = function() {
        alert ('NOW: show the animation');
    }

    // the iframe is done loading a new page. Hide the animation again
    var content_finished_loading = function() {
        alert ('DONE: hide the animation');
    }

    // Listen to messages sent from the content iframe
    var receiveMessage = function receiveMessage(e){
        var url = window.location.href,
            url_parts = url.split("/"),
            allowed = url_parts[0] + "//" + url_parts[2];

        // Only react to messages from same domain as current document
        if (e.origin !== allowed) return;
        // Handle the message
        switch (e.data) {
            case 'iframe_change': content_start_loading(); break;
        }
    };
    window.addEventListener("message", receiveMessage, false);

    // This will be triggered when the iframe is completely loaded
    content.on('load', content_finished_loading);
}

答案 2 :(得分:0)

当您动态创建iframe时,请包含ONLOAD事件,如此...

F=document.createElement('iframe');
F.onload=function(){
    UpdateDetails(
        this.contentWindow.document.title,
        this.contentWindow.location
    );
};
F.src='some url';
document.getElementById('Some_Container').appendChild(F);

onload事件现在将通过下面的函数不断更新下面的全局变量,因为用户上网:

var The_Latest_Title='';
var The_Latest_URL='';
function UpdateDetails(Title,URL){
    The_Latest_Title=Title;
    The_Latest_URL=URL;
}

答案 3 :(得分:0)

已经有一个可能的解决方案:iFrame src change event detection?

但是,如果要操作目标页面,则不需要触摸iframe目标文件内容。只需在父页面中添加正确的JS代码,它就可以访问SAME-ORIGIN iframe。我使用过这样的东西:

<iframe id="xyz" ....>
.....
<script>
var iframeElement = document.getElementById("xyz");
var iframe_El = iframeElement.contentDocument || iframeElement.contentWindow.document;
// manipulate iframe_El wih "on complete" events and like that.
....
</script>

更多信息:https://jsfiddle.net/Lnb1stc8/