2014-01-29 73 views
0

今天我遇到了一個問題,它稍微攪動了我。我正在爲特定的基於Web的應用程序編寫Chrome擴展。該網頁是一個(包裝)IFRAME,在真正的頁面內可以找到,但內部框架是更多的IFRAME。JQuery - 等待嵌套的iFrame完成加載

爲了確定我目前在應用程序中的位置,我需要讀取一些數據,這是深度兩個iframe。我已經找到一個辦法讓我尋找具有以下字符串:

document.getElementById("firstiframe").contentWindow.document.getElementById("secondiframe").contentWindow.document.getElementById("theelement").innerText; 

這裏的問題是,因爲這得到執行所需的所有幀必須存在。由於secondiframe在腳本執行後加載,因此它在getElementById("secondiframe")上失敗,因爲它尚不存在。

在我看來,我需要耐心等待,直到第二個iframe被加載,直到我執行搜索。在這裏,我不能比第一個iframe更進一步。

$('#firstiframe').load(function() { 
    $('#secondiframe').load(function() { 
     console.log("We made it!"); 
    }); 
}); 

這並不工作,有人建議我去尋找這樣的事情:

$('#firstiframe').load(function() { 
    $(this).contents().find('#secondiframe').load(function() { 
     console.log("We made it!"); 
    }); 
}); 

然而,這既不是成功的,它永遠不會傳遞/匹配到secondiframe。

在此先感謝!

回答

0

你說第二個iframe不存在,當你加載第一個。 委託的處理程序會照顧到這一點。

$('divAroundBothIframes').on('load', '#secondiframe', function() { 
    console.log("We made it!");  
}); 

或者圍繞那條線擺弄一下。

http://api.jquery.com/on/

+0

這一個仍然不工作,它根本不通過。我不能使它與這樣的事情? '$('#firstiframe')。contentWindow.document.GetElementById('secondiframe')。load' – user3249751

+0

@ user3249751嗯,你究竟是什麼意思:「根本不通過」?檢查我編輯的答案,沒有一個jsFiddle或一些事情會很麻煩。你可以混合使用jQuery和vanilla Javascript,是的,但是這並不能滿足你的問題,你想傳遞一個處理程序的對象在傳遞那個處理程序時不存在,你明白嗎? – loveNoHate

0

在這些類型的場景,我做的是寫在父頁面的功能,並從IFRAME內容的onload包括。您可以使用parent.functionName();在您的父窗口中調用該函數。

在你的情況下,我建議保持變量指向iframe是否加載。類似isIFrame1Loaded和isIFrame2Loaded。這些應該通過從內部iframe觸發的onLoad函數來更新。他們還應該檢查是否所有變量都已設置,如果是,請執行您的代碼。