Firefox addon 动态插入html和选项卡

Firefox addon 动态插入html和选项卡,firefox-addon,Firefox Addon,我正在构建一个使用browser overlay.xul的插件,其中包含js文件。我发现在网页上修改HTML最简单的方法就是我在mdn上找到的这段代码 const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START; const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP; var myListener = {

我正在构建一个使用browser overlay.xul的插件,其中包含js文件。我发现在网页上修改HTML最简单的方法就是我在mdn上找到的这段代码

const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START;
const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP;

var myListener = {
    QueryInterface: function(aIID) {
        if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
        aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
        aIID.equals(Components.interfaces.nsISupports))
        return this;
        throw Components.results.NS_NOINTERFACE;
    },
    onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { },
    onLocationChange: function(aProgress, aRequest, aURI) {
        PageLoad.initialzed = false;
        PageLoad.init();
    },
    onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) { },
    onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) { },
    onSecurityChange: function(aWebProgress, aRequest, aState) { }
};

gBrowser.addProgressListener(myListener);


var PageLoad = {
    initialzed : false,
    browser : null,
    domain : null,
    appcontent : null,

    init : function() {
        PageLoad.appcontent = document.getElementById("appcontent");
        if (PageLoad.appcontent) {
            PageLoad.appcontent.addEventListener("DOMContentLoaded", PageLoad.load, true);
        }
    },
    load : function() {
                //I do this so it only calls the function once
        if (PageLoad.initialzed == false) {
            PageLoad.initialzed = true;
            PageLoad.browser = gBrowser.contentDocument;
            PageLoad.domain  = (PageLoad.browser.location.host.match(/([^.]+)\.\w{2,3}(?:\.\w{2})?$/) || [])[1];
            myFunctiontoInsertHTML();
        }

    }
};

然后我可以在我的函数中使用
PageLoad.browser.createElement('div')
等等。。到目前为止,这种方法效果不错,但我遇到了一个问题,即当多个选项卡打开时,my
PageLoad.domain
变量包含上次加载的选项卡或网页的域(这反过来会导致在两个或更多不同的页/选项卡上插入html时出错)。因此,我想更改的是,每当用户单击其他选项卡或重新加载页面时,我想调用该函数,但我遇到了一个死胡同。

gBrowser.contentDocument
是当前浏览器选项卡中加载的页面文档-一旦用户切换选项卡或导航到其他页面,其值就会更改,并且您不应该保留旧值(这是内存泄漏)。如果您正在观察所有浏览器选项卡的进度,则应查看所需的浏览器选项卡。在您的例子中的含义是:
aProgress.DOMWindow
(请参阅)。如果您对单个选项卡的加载进度感兴趣,您也应该在这里附加
DOMContentLoaded
事件侦听器。

请检查,我使用的是我自己的“页面加载”链接变体,但我认为这个url栏侦听器正是我需要的。感谢Wladimir迄今为止的所有帮助。我似乎在
gBrowser.addProgressListener
中遇到了更大的问题。奇怪的是,在我安装插件之后,它就可以工作了。如果我关闭浏览器并重新启动它,插件将再次工作,正如预期的那样,但是如果我再次关闭浏览器并重新打开它,插件将无法工作。在错误控制台中,它显示“
gBrowser.addProgressListener
不是函数”。在我重新安装该插件之前,它不会再次工作。冲洗并重复,如果重新启动浏览器3次,它将不再工作。