[英]Why is this JavaScript page redirect so slow?
我正在實施Firefox插件。 在插件的工具欄中,我捕獲了當前頁面,並在用戶嘗試轉到荷蘭Google時將其重定向到UK Google。 但是,此代碼需要永遠完成。 當我輸入“ google.nl”或“ google.com/nl”時,我的瀏覽器將顯示荷蘭頁面,並至少需要1秒鍾才能重定向。
有什么方法可以使重定向更快? 理想情況下,我希望用戶完全不要看到荷蘭Google頁面。
function loadURL(url) {
window._content.document.location = url;
window.content.focus();
}
var redirected = false;
function onChange()
{
var url = gBrowser.selectedBrowser.currentURI.spec;
url = encodeURIComponent(url);
if(url.indexOf("google.nl") !=-1 || url.indexOf("hl%3Dnl") !=-1){
if (!redirected){
redirected = true;
loadURL("https://www.google.co.uk/");
return;
}
}else{
redirected = false;
}
}
注意: onChange()
由container.addEventListener('DOMSubtreeModified',onChange, false);
觸發container.addEventListener('DOMSubtreeModified',onChange, false);
永遠不要使用DOMSubtreeModified
,它是應該被刪除的MutationEvent
。 您應該使用MutationObserver
因此,在您的情況下,而不是container.addEventListener('DOMSubtreeModified, onChange, false);
做這個:
const gMutationConfig = {
subtree: true,
childList: true
};
var gMutationFunc = function(ms) {
for (let m of ms) {
console.log(m.type, m);
//if (mutation.addedNodes && mutation.addedNodes.length > 0) { //this test if elements added
onChange();
}
};
var gMutationObserver = new this.DOMWindow.MutationObserver(container);
您可能應該使用nsIHTTPChannel
使重定向最快
const { Ci, Cu, Cc, Cr } = require('chrome'); //const {interfaces: Ci, utils: Cu, classes: Cc, results: Cr } = Components;
Cu.import('resource://gre/modules/Services.jsm');
Cu.import('resource://gre/modules/devtools/Console.jsm');
var observers = {
'http-on-modify-request': {
observe: function (aSubject, aTopic, aData) {
console.info('http-on-modify-request: aSubject = ' + aSubject + ' | aTopic = ' + aTopic + ' | aData = ' + aData);
var httpChannel = aSubject.QueryInterface(Ci.nsIHttpChannel);
var requestUrl = httpChannel.URI.spec
if (requestUrl.indexOf('google.com') > -1) {
//httpChannel.cancel(Cr.NS_BINDING_ABORTED); //this aborts the load
httpChannel.redirectTo(Services.io.newURI('data:text,url_blocked', null, null)); //can redirect with this line, if dont want to redirect and just block, then uncomment this line and comment out line above (line 17)
}
},
reg: function () {
Services.obs.addObserver(observers['http-on-modify-request'], 'http-on-modify-request', false);
},
unreg: function () {
Services.obs.removeObserver(observers['http-on-modify-request'], 'http-on-modify-request');
}
}
};
要開始觀察所有請求,請執行此操作(例如,在啟動插件時)
for (var o in observers) {
observers[o].reg();
}
停止觀察很重要(確保至少在插件關閉時運行此命令,由於內存原因,您不想讓觀察者注冊)
for (var o in observers) {
observers[o].unreg();
}
用於阻止/重定向URL的觀察者服務的完整工作示例: https : //github.com/Noitidart/PortableTester/tree/block-urls
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.