从基于xul的firefox扩展中加载隐藏iframe中的多个页面

时间:2013-09-07 16:20:36

标签: iframe firefox-addon xul onload domcontentloaded

从基于xul的firefox插件开始,我需要:

  1. 以编程方式创建一个不可见的iframe(一次)
  2. 在插件运行时重复使用它来加载多个网址
  3. 在每个网址加载后访问返回的HTML
  4. 问题:我只能为任何创建的iframe获取第一个页面加载,以触发'onload'或'DOMContentLoaded'事件。对于后续URL,不会触发任何事件。

    注意:如果可能的话,我也可以使用hiddenDOMWindow本身......

    代码:

    var urls = ['http://en.wikipedia.org/wiki/Internet', 'http://en.wikipedia.org/wiki/IPv4', 'http://en.wikipedia.org/wiki/Multicast' ];
    
    visitPage(urls.pop());
    
    function visitPage(url) {
    
        var XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
    
        var hiddenWindow = Components.classes["@mozilla.org/appshell/appShellService;1"].getService
            (Components.interfaces.nsIAppShellService).hiddenDOMWindow;
    
        var doc = hiddenWindow.document, iframe = doc.getElementById("my-iframe");
    
        if (!iframe) 
        {
            iframe = doc.createElement("iframe");
            //OR: iframe = doc.createElementNS(XUL_NS,"iframe");
    
            iframe.setAttribute("id", "my-iframe");
            iframe.setAttribute('style', 'display: none');
    
            iframe.addEventListener("DOMContentLoaded", function (e) { 
                dump('DOMContentLoaded: '+e.originalTarget.location.href);
                visitPage(urls.pop()); 
            });
    
            doc.documentElement.appendChild(iframe);
        }
    
        iframe.src = url;    
    }
    

1 个答案:

答案 0 :(得分:2)

有一些陷阱:

  • hiddenWindow平台之间有所不同。它是Mac上的XUL和其他HTML。
  • 您应该使用.setAttribute("src", url);可靠地导航。

以下适用于我(Mac,Win7):

var urls = [
    'http://en.wikipedia.org/wiki/Internet',
    'http://en.wikipedia.org/wiki/IPv4',
    'http://en.wikipedia.org/wiki/Multicast'
];

var hiddenWindow = Components.classes["@mozilla.org/appshell/appShellService;1"].
                   getService(Components.interfaces.nsIAppShellService).
                   hiddenDOMWindow;

function visitPage(url) {
    var iframe = hiddenWindow.document.getElementById("my-iframe");
    if (!iframe) {
        // Always use html. The hidden window might be XUL (Mac)
        // or just html (other platforms).
        iframe = hiddenWindow.document.
                 createElementNS("http://www.w3.org/1999/xhtml", "iframe");
        iframe.setAttribute("id", "my-iframe");
        iframe.addEventListener("DOMContentLoaded", function (e) {
            console.log("DOMContentLoaded: " +
                        e.originalTarget.location);
            var u = urls.pop();
            // Make sure there actually was something left to load.
            if (u) {
                visitPage(u);
            }
        });
        hiddenWindow.document.documentElement.appendChild(iframe);
    }
    // Use .setAttribute() to reliably navigate the iframe.
    iframe.setAttribute("src", url);
}

visitPage(urls.pop());

请勿重新加载hiddenWindow本身,否则您将破坏许多其他代码。