2009-11-23 115 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);