Javascript Fire Fox分机(观察员)-触发器“;http on modify request“;只有一次

Javascript Fire Fox分机(观察员)-触发器“;http on modify request“;只有一次,javascript,firefox,firefox-addon,firefox-addon-sdk,Javascript,Firefox,Firefox Addon,Firefox Addon Sdk,实际上,我正试图在用户按下地址栏上的ENTER键后以及onLocationChange之前立即捕获事件。我使用以下链接作为指南设置了一个观察者:,并具有类似于下面的内容 但是,控制台会打印许多URL,甚至是图像和脚本。如何修改代码,使函数仅触发一次或禁用,直到地址栏更改或单击链接为止 我想我可以设置自己的变量来跟踪URL上是否触发了请求,但我想知道是否有更有效的解决方案 var httpRequestObserver = { ioService: Cc["@mozilla.org/net

实际上,我正试图在用户按下地址栏上的ENTER键后以及onLocationChange之前立即捕获事件。我使用以下链接作为指南设置了一个观察者:,并具有类似于下面的内容

但是,控制台会打印许多URL,甚至是图像和脚本。如何修改代码,使函数仅触发一次或禁用,直到地址栏更改或单击链接为止

我想我可以设置自己的变量来跟踪URL上是否触发了请求,但我想知道是否有更有效的解决方案

var httpRequestObserver = {
    ioService: Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService),

    observe: function(subject, topic, data) {
                if (topic == "http-on-modify-request") {

                    var httpChannel = subject.QueryInterface(Ci.nsIHttpChannel);

                    console.log(httpChannel.URI.spec);
                }
            },

    register: function() {
        this.observerService.addObserver(this, "http-on-modify-request", false);
    },

    unregister: function() {
        this.observerService.removeObserver(this, "http-on-modify-request");
    }
};

httpRequestObserver.register();
我最初使用“http on modify request”观察者,因为它是建议在请求头中修改referer的位置。然而,我后来意识到Chrome的Web请求API是可用的,并使用了以下代码

const {WebRequest} = Cu.import("resource://gre/modules/WebRequest.jsm", {});

WebRequest.onBeforeSendHeaders.addListener(setReferrer, { types: ['main_frame'] }, ['blocking', 'requestHeaders']);

function setReferrer(e) {
    //some other code

    for (var i in e.requestHeaders) {
        if (e.requestHeaders[i].name === 'Referer') {
            e.requestHeaders.splice(i, 1);
            break;
        }
    }

    e.requestHeaders.push({name : 'Referer', value : 'myreferer.com'});
    return { requestHeaders: e.requestHeaders };
}
我最初使用“http on modify request”观察者,因为它是建议在请求头中修改referer的位置。然而,我后来意识到Chrome的Web请求API是可用的,并使用了以下代码

const {WebRequest} = Cu.import("resource://gre/modules/WebRequest.jsm", {});

WebRequest.onBeforeSendHeaders.addListener(setReferrer, { types: ['main_frame'] }, ['blocking', 'requestHeaders']);

function setReferrer(e) {
    //some other code

    for (var i in e.requestHeaders) {
        if (e.requestHeaders[i].name === 'Referer') {
            e.requestHeaders.splice(i, 1);
            break;
        }
    }

    e.requestHeaders.push({name : 'Referer', value : 'myreferer.com'});
    return { requestHeaders: e.requestHeaders };
}

使用observer服务是不安全的,它可能会捕获来自其他地方的请求,在当今热爱ajax的世界中,很可能会有大量请求触发。我认为NSIwebListener会更好,但这也容易受到同样的影响。我不确定最好的解决方案是什么这是一个好问题我也感兴趣。但是如果您这样做或使用nsIWebProgressListener,您只需在第一个触发器上取消注册。下面是如何附加nsiWebProgress:实际上,这个问题与我原来的问题有些关联:。我需要在用户键入并按enter键时获取URL。有时,像google.com这样的URL会被重定向到或其他地方。在导航开始之前,我需要原始的。我已经在使用progressListner,需要更快的东西。Kango有一个BEFORE_导航事件。不知道他们是怎么做的。这并不能完全回答我的问题,但我使用观察者来模拟Chrome扩展的WebRequest和onBeforeSendHeaders监听器。我之前看到的示例使用了观察器,但现在我可以只使用WebRequest.jsm。我不再需要这个问题的答案了,但让它保持开放状态,因为它很有趣,可能会引导未来的人们进入这里。添加观察者,并在
observer:
部分放入
httpRequestObserver.unregister()
,捕捉一个并停止。@Noitidart一旦取消注册,当用户通过单击链接或键入新地址更改URL时,观察者是否会触发?如果确实如此,那么它可能并不总是实用的。此外,请求来自各种来源-脚本、Web服务、用户单击的实际网站链接、图像等。不太可能,我总是在第一次观察中得到用户单击的链接(这是我想要的)。使用observer服务不安全,它可能会捕获其他地方的请求,在当今热爱ajax的世界中,很可能会有大量的请求被触发。我认为NSIwebListener会更好,但这也容易受到同样的影响。我不确定最好的解决方案是什么这是一个好问题我也感兴趣。但是如果您这样做或使用nsIWebProgressListener,您只需在第一个触发器上取消注册。下面是如何附加nsiWebProgress:实际上,这个问题与我原来的问题有些关联:。我需要在用户键入并按enter键时获取URL。有时,像google.com这样的URL会被重定向到或其他地方。在导航开始之前,我需要原始的。我已经在使用progressListner,需要更快的东西。Kango有一个BEFORE_导航事件。不知道他们是怎么做的。这并不能完全回答我的问题,但我使用观察者来模拟Chrome扩展的WebRequest和onBeforeSendHeaders监听器。我之前看到的示例使用了观察器,但现在我可以只使用WebRequest.jsm。我不再需要这个问题的答案了,但让它保持开放状态,因为它很有趣,可能会引导未来的人们进入这里。添加观察者,并在
observer:
部分放入
httpRequestObserver.unregister()
,捕捉一个并停止。@Noitidart一旦取消注册,当用户通过单击链接或键入新地址更改URL时,观察者是否会触发?如果确实如此,那么它可能并不总是实用的。此外,请求来自不同的来源——脚本、Web服务、用户单击的实际网站链接、图像等。我不太可能在第一次观察中总是得到用户单击的链接(这是我想要的)。