[英]chrome.webRequest.onBeforeRequest.addListener Cannot read property 'onBeforeRequest' of undefined
[英]chrome.webRequest.onBeforeRequest.addListener not blocking an array of urls
我正在嘗試根據用戶輸入阻止一組網址。 我具有JSON格式的url數組,但是當我導航到這些站點時,這些站點實際上並未被阻止。 如果我只使用一個站點而不是一個陣列,則它確實會被成功阻止。 這是功能。
function addListener(){
chrome.webRequest.onBeforeRequest.addListener(
function(){ return {cancel: true}; },
{
urls: blockedUrls()
},
["blocking"]
);
}
這是我的功能blockedUrls。
var blockedUrls = function () {
chrome.storage.sync.get(['block'], function(result) {
if (typeof result.block === 'undefined') {
//blocks is not yet set
var jobj = ["*://www.whatever.com/*"];
return [jobj[0]];
console.log("not set");
}
else{
var xt = JSON.parse(result.block);
console.log(JSON.stringify(xt.urls));
return JSON.stringify(xt.urls);
}
});
return ["*://www.whatever.com/*"];
}
console.log確實打印出了我想要的東西,這就是(顯然有些只是用於測試)
["doesntexist.com","*://www.yahoo.com/*","*://www.xbox.com/*","*://www.hello.com/*","*://www.es/*"]
而且,如果有幫助,這里是從變量request.newSites初始將站點設置為chrome存儲的地方。
var jsonStr = '{"urls":["doesntexist.com"]}';
var obj = JSON.parse(jsonStr);
//add url matching patterns to the urls from user input
for (var i = 0; i < request.newSite.length; i++){
obj['urls'].push( '*://www.' + request.newSite[i] + '/*');
}
jsonStr = JSON.stringify(obj);
chrome.storage.sync.set({'block': jsonStr}, function(){
addListener();
});
提前致謝。
chrome.storage.sync.get
是一個異步函數。 因此,它不會返回您的網址列表。
您可能打算做的是以下操作:
function addListener(){
chrome.storage.sync.get(['block'], function(result) {
let urls;
if (typeof result.block === 'undefined') {
//blocks is not yet set
var jobj = ["*://www.whatever.com/*"];
urls = [jobj[0]];
console.log("not set");
}
else{
var xt = JSON.parse(result.block);
console.log(JSON.stringify(xt.urls));
urls = JSON.stringify(xt.urls);
}
chrome.webRequest.onBeforeRequest.addListener(
function(){ return {cancel: true}; },
{
urls: urls
},
["blocking"]
);
});
}
您的代碼有兩個問題:
1) chrome.storage.sync.get
的回調函數是異步的 。 因此,在函數blockedUrls
,返回值將始終為["*://www.whatever.com/*"]
,因為該行return ["*://www.whatever.com/*"];
將在chrome.storage.sync.get
的回調函數之前運行。
2) chrome.webRequest.onBeforeRequest
偵聽器的第二個參數應為以下形式的對象: {urls: theUrls}
其中theUrls
是字符串數組 ,而不是字符串。
除此之外,您可以利用chrome.storage
可以直接存儲對象和數組的事實,因此無需對其進行字符串化。
嘗試:
var obj = {urls: ['*://doesntexist.com/*']};
for (var i = 0, j = request.newSite.length; i < j; i++){
obj.urls.push( '*://www.' + request.newSite[i] + '/*');
}
chrome.storage.sync.set({block: obj}, function(){
addListener();
});
function addListener() {
chrome.storage.sync.get('block', function (result) {
var myUrls = result.block || ["*://www.whatever.com/*"];
chrome.webRequest.onBeforeRequest.addListener(function(){
return {cancel: true}
},
{urls: myUrls},
["blocking"] );
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.