我正在为Fennec开发一个简单的扩展程序,该扩展程序必须在每个加载的页面上添加特殊的HTML元素。我创建了这个简单的overlay.js:

var MyAddon = {
    onLoad: function(aEvent){
        var appcontent = document.getElementById("appcontent"); // Firefox
        if (!appcontent) {
            appcontent = document.getElementById("browsers"); // Fennec
        }
        if (appcontent) {
            appcontent.addEventListener("DOMContentLoaded", MyAddon.onDocumentLoad, true);
        }
    },

    onUnLoad: function(aEvent){
        var appcontent = document.getElementById("appcontent"); // Firefox
        if (!appcontent) {
            appcontent = document.getElementById("browsers"); // Fennec
        }
        if (appcontent) {
            appcontent.removeEventListener("DOMContentLoaded", MyAddon.onDocumentLoad, true);
        }
    },

    onUIReady: function(aEvent){
    },

    onUIReadyDelayed: function(aEvent) {
    },

    onDocumentLoad: function(aEvent) {
    alert("OK");
    }
};

window.addEventListener("load", MyAddon.onLoad, false);
window.addEventListener("unload", MyAddon.onUnLoad, false);
window.addEventListener("UIReady", MyAddon.onUIReady, false);
window.addEventListener("UIReadyDelayed", MyAddon.onUIReadyDelayed, false);


问题在于,启动浏览器时仅显示一次警报,我希望它会在加载的每个页面上显示。我究竟做错了什么?

Fennec版本:4.0b5(在Windows桌面版本上测试)

谢谢!

最佳答案

不幸的是,这对于Fennec而言更为复杂。内容文档中没有诸如“ DOMContentLoaded”之类的事件。这是因为主窗口(覆盖层覆盖了Javascript)与子窗口(内容窗口)处于不同的进程中
你必须:

在每个新标签页中加载脚本:
browser.messageManager.loadFrameScript(“ chrome://my_add_on/content/content.js”,true);

在content.js中,侦听DOMContentLoaded事件:
addEventListener(“ DOMContentLoaded”,process,true);
函数过程(事件){...}


有关更多信息,请检查以下页面:

https://wiki.mozilla.org/Mobile/Fennec/Extensions/Electrolysis
https://hg.mozilla.org/mobile-browser/file/8167d57cab8e/chrome/content/browser.js#l1327

09-26 10:51