从Firefox扩展访问iFrame的dom

时间:2009-11-23 18:50:53

标签: javascript firefox xul firefox-addon

我花了很长时间尝试不同的工作来实现这一点,但没有任何事情和文档没有多大帮助。

我正在尝试在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);

工作正常,并且DOES触发populate()方法。我的问题是获取该iframe的文档或窗口对象。我已经尝试了以下所有方法:

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

但这些都是未定义的。

我还尝试将事件对象传递给iframe的load事件侦听器,然后执行:

event.originalTarget

但这也不起作用。

我正在阅读以下文档:

但要么我不理解它,要么就是没有正确解释。

任何人都能解释一下吗?

谢谢!

4 个答案:

答案 0 :(得分:3)

您是否尝试过使用contentWindow属性?

var doc = iframe.contentWindow.document;

答案 1 :(得分: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) {
                    ...;
                }
            }

答案 2 :(得分:1)

我正在传递事件对象然后event.originalTarget(就像你提到的那样)并且它工作正常。虽然我必须将addEventListener的useCapture参数设置为true才能调用我的事件。

因此,如果我理解正确,您需要在populate方法中访问文档......

我会将event.originalTarget作为参数传递给您的方法 要么 在load事件中,我将设置示例myObject.document属性,然后在populate方法中使用它。

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

答案 3 :(得分:0)

我差点遇到同样的问题。使用以下代码获取iframe(Firebug用于调试):

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