2009-11-23 137 views
2

我花了很長時間嘗試不同的東西來實現這個功能,但沒有任何功能,文檔沒有什麼幫助。從Firefox擴展中訪問iFrame的dom

我正試圖填充一個表格,我動態注入到一個頁面的iframe。要注入iframe我做:

myObject.iframe = document.createElement("iframe"); 
myObject.iframe.setAttribute("src", data.url); 
myObject.iframe.setAttribute("id","extension-iframe"); 
myObject.window.document.getElementById('publisher').appendChild(myObject.iframe); 
myObject.iframe.addEventListener("load", function(){ 
    myObject.populate(data); 
}, false); 

它工作正常,並且會觸發populate()方法。我的問題是獲取該iframe的文檔或窗口對象。我試過以下所有內容:

myObject.iframe.window 
myObject.iframe.document 
myObject.iframe.content 

但這些都是未定義的。

我也試過路過事件對象到iframe的load事件監聽器,然後做:

event.originalTarget 

但是,這也不能工作。

我讀了以下文件:

但無論哪種,我不理解它,或者它只是沒有適當解釋。

任何人都可以點亮一下嗎?

謝謝!

回答

1

嘗試myObject.iframe.contentDocument

東西沿着這一行:我傳遞事件

// For accessing browser window from sidebar code. 
var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
        .getInterface(Components.interfaces.nsIWebNavigation) 
        .QueryInterface(Components.interfaces.nsIDocShellTreeItem) 
        .rootTreeItem 
        .QueryInterface(Components.interfaces.nsIInterfaceRequestor) 
        .getInterface(Components.interfaces.nsIDOMWindow); 

var gBrowser = mainWindow.gBrowser; 

var iframes = gBrowser.contentDocument.getElementsByTagName("iframe"); 
      for (var i=0; i < iframes.length; i++) { 
       var check_elem = iframes[i].contentDocument.getElementById('myid'); 
       if (check_elem) { 
        ...; 
       } 
      } 
+0

這可能適用於瀏覽器,但XUL iframe呢?我可以證實Lukasz Salamon的答案正在爲XUL工作。 – NoBugs 2013-06-01 02:12:39

3

您是否嘗試過使用contentWindow屬性?

var doc = iframe.contentWindow.document; 
+0

我做了但仍無法訪問該窗口。檢查此更加完整的解釋:http://gist.github.com/242927 並且預先感謝所有幫助。 – luisgo 2009-11-25 18:49:25

+0

我沒有別的,然後對不起,不熟悉XUL。 – 2009-11-25 22:43:51

+0

XUL中加載時contentWindow不可用。具有諷刺意味的是,如果你使用JS調試器,它會起作用,因爲你稍後會進步。 – NoBugs 2013-06-01 02:11:00

0

我幾乎有同樣的問題。使用下面的代碼獲取我的iframe(螢火蟲用於調試):

iframes = window.content.document.getElementsByTagName('iframe') 
for (var i = 0; i < iframes.length; i++) { 
    var elmInput = iframes[i]; 
    Firebug.Console.log(elmInput); 
} 
1

對象,然後event.originalTarget(就像你提到的),它的工作正常。儘管我必須將addEventListener的參數useCapture設置爲true才能獲取我的事件。

所以,如果我理解正確的話,你需要填入的方法來訪問文件...

我會通過event.originalTarget作爲參數傳遞給你的方法 或 在負載情況下,我會爲例如myObject.document屬性設置,然後使用它在填充方法。

myObject.iframe.addEventListener("load", function(event){ 
    var doc = event.originalTarget; 
    myObject.populate(data,doc); 
}, false);