javascript - chrome.webRequest.onBeforeRequest.addListener 不阻止 URL 数组
问题描述
我正在尝试根据用户输入阻止一组 url。我有 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();
});
提前致谢。
解决方案
您的代码有几个问题:
1)chrome.storage.sync.get
的回调函数是异步的。因此,在您的函数blockedUrls
中,返回值将始终为["*://www.whatever.com/*"]
,因为该行将在的回调函数return ["*://www.whatever.com/*"];
之前运行。chrome.storage.sync.get
2) chrome.webRequest.onBeforeRequest
listener 的第二个参数应该是如下形式的对象:
{urls: theUrls}
wheretheUrls
是一个字符串数组,而不是字符串。
除此之外,您可以利用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"] );
});
}
推荐阅读
- mysql - 如何从节点js中的mysql回调函数返回数据
- python - 如何添加到 dicts 键并将其格式化为字符串?
- wordpress - 在搜索表单 woocommerce 中添加类别下拉列表
- java - 改造、Kotlin 和访问隐藏方法灰名单 API
- css - 如何在 Tailwind 中转换背景位置:%
- ios - 如何始终在具有动态高度的视图上获得圆角(角半径)?
- c++ - std::declval 如何返回值?
- ios - 带有完成处理程序的 UIImageView
- ruby-on-rails - TargetRubyVersion 参数,在 AllCops Not Working 下
- php - PHP数组中的内爆相邻元素(按索引)