Javascript Firefox扩展开发:如何只设置一次观察者

Javascript Firefox扩展开发:如何只设置一次观察者,javascript,firefox,firefox-addon,instance,Javascript,Firefox,Firefox Addon,Instance,我用一小段代码创建了一个很小的Firefox扩展。大概是这样的: var load = function() { Components.classes['@mozilla.org/observer-service;1'].getService(Components.interfaces.nsIObserverService).addObserver({ observe: function(subject, topic, data) {

我用一小段代码创建了一个很小的Firefox扩展。大概是这样的:

var load = function() {
    Components.classes['@mozilla.org/observer-service;1'].getService(Components.interfaces.nsIObserverService).addObserver({
            observe: function(subject, topic, data) {
                    var channel = subject.QueryInterface(Components.interfaces.nsIHttpChannel);
                    if(/google\.com/.test(channel.originalURI.host)) {
                            // magic here
                    }
            }
    }, 'http-on-modify-request', false);
};

window.addEventListener('load', load, false);
当我将此插件提交给Firefox插件时,我得到以下返回:

您正在为每个打开的窗口创建一个HTTP观察器,同时 应该只是一个实例


现在如何创建一个observer实例?

您应该使用JS代码模块。在覆盖脚本中放置:

Cu.import("resource://yourPluginName/yourModule.jsm");
在您的
yourModule.jsm
中,仅在此处放置您的观察者示例:

const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
var observerService = Cc["@mozilla.org/observer-service;1"]
    .getService(Ci.nsIObserverService);
observerService.addObserver(testObs, "http-on-examine-response", false);

var testObs = {
    observe: function(aSubject, aTopic, aData){
        //...
    } 
}

顺便说一句,在jsm中,不能使用窗口对象

您启发我使用以前的代码解决方案以正确的方式实现observer。我刚才已经在我的代码中测试过了,它很有效。回答得很好!别忘了放
var\u符号=[]编码到模块中,否则将抛出错误。