实际上,我试图在用户按下地址栏上的ENTER和onLocationChange之前的瞬间捕获事件。我使用以下链接作为指南设置观察者:https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School/Intercepting_Page_Loads,并且具有类似于下面的内容。
但是,控制台会打印许多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();
答案 0 :(得分:0)
我最初使用“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 };
}