如何在加载前获取Iframe事件?

时间:2012-01-18 18:57:53

标签: javascript jquery events javascript-events

在我的网站中,我在iframeB中使用iframeA,并且当iframeA更改其内容时,我必须设置src。我只能使用onload事件设置它,但是在加载站点时会调用它。我正在寻找一些事件或触发器,这有助于我在开始加载之前检测位置/ src更改。在src设置之前,我不想等待整个页面加载。我没有直接访问iframeA(只是下面的脚本)

一些代码:

var myframe = document.getElementById('frameB').contentWindow.document.getElementById('frameA');
myframe.onload=function (funcname) {...};

4 个答案:

答案 0 :(得分:1)

什么会改变iframe的来源?如果您有权访问该代码,那么您可以执行onload函数中的任何操作。

如果某个链接的target属性设置为iframe,那就是来源的变化方式,那么您可以点击链接点击次数:

$('a[target="frameB"]').bind('click', function () {
    //run your onload code here, it will run as the iframe is downloading the new content
});

另外,只需注意,您可以在jQuery中绑定load事件的事件处理程序,如下所示:

$('#frameB').bind('load', function () {
    //run onload code here
});

更新

网站 - > frameB - > frameA

$("#frameB").contents().find("#frameA").bind('load', function () {
    //load code here
});

这将选择#frameB元素(位于当前顶级DOM中),获取其内容,找到#frameA元素,然后绑定load事件的事件处理程序

请注意,必须在#frameB加载其DOM中已存在的#frameA元素后运行此代码。这样的事情可能是一个好主意:

$('#frameB').bind('load', function () {
    $(this).contents().find('#frameA').bind('load', function () {
        //run load code here
    });
});

更新

#frameB元素中的hi-jack链接:

$('#frameB').contents().find('a[target="frameA"]').bind('click', function () {
    /*run your code here*/
});

这会在#frameB元素中找到target属性设置为frameA并添加click事件处理程序的任何链接。

同样,这仅在#frameB iframe元素已加载(或至少获得document.ready事件)时才有效,因此您可以选择它的元素。

答案 1 :(得分:1)

您还可以尝试采用检测iframe何时离开其当前位置的方法。这在某些情况下可能很有用。为此,请将以下代码放入iFarme源代码中。

  

$(窗口).on(' beforeunload',function(){

     

提醒('加载之前......');

     

});

答案 2 :(得分:1)

将此gist或我的answer检查到此question。那里的代码完全是这样的:

function iframeURLChange(iframe, callback) {
    var unloadHandler = function () {
        // Timeout needed because the URL changes immediately after
        // the `unload` event is dispatched.
        setTimeout(function () {
            callback(iframe.contentWindow.location.href);
        }, 0);
    };

    function attachUnload() {
        // Remove the unloadHandler in case it was already attached.
        // Otherwise, the change will be dispatched twice.
        iframe.contentWindow.removeEventListener("unload", unloadHandler);
        iframe.contentWindow.addEventListener("unload", unloadHandler);
    }

    iframe.addEventListener("load", attachUnload);
    attachUnload();
}

它利用unload事件。每当卸载一个页面时,一个新页面都应该启动加载。但是,如果您收听该事件,则会获得当前的URL,而不是新的URL。通过添加0毫秒延迟的超时,然后然后检查URL,您将获得新的iframe URL。

但是,每次加载新页面时都会删除unload侦听器,因此必须在每个load上重新添加它。

但该功能可以解决所有这些问题。要使用它,您只需要:

iframeURLChange(document.getElementById("myframe"), function (url) {
    console.log("URL changed:", url);
});

答案 3 :(得分:0)

我认为使用适当的事件处理程序向onload标记添加内联iframe属性可以解决您的问题。

function onIframeLoad(){
   //Write your code here
}

标记更改

<iframe src='..' onload='onIframeLoad()' />