【发布时间】:2015-07-13 09:56:42
【问题描述】:
您好,我正在为一些简单的网站拦截器的练习制作 chrome 扩展。我有两个不同的 JS 文件需要共享包含要阻止的 URL 的同一数组。
- background.js 处理 webRequests 和阻止网站
- options.html 是用户可以编辑要屏蔽的 URL 的选项页面,它调用 storeURL.js 以便将 html 页面上列表中的所有元素存储到一个 js 数组中。到目前为止没有问题。
但是我无法从 background.js 访问 storeURL.js 内部的数组。似乎它们是在两个不同的实例中被调用的。如果我尝试在我的 background.html 中同时包含 storeURL.js 和 background.js,这会导致两个完全独立的 storeURL.js 脚本运行。
我该怎么做呢?我应该将 storeURL.js 中的数组内容存储到文件中吗?
一些例子:
background.js
chrome.webRequest.onBeforeRequest.addListener(
blocking,["blocking"]);
{ urls: blockedURLS, types: [] }, ["blocking"]);
storeURL.js 根据 options.html 中的列表填充数组
var blockedURLS = [];
$('li').each(function(i, elem) {
blockedURLS.push($(elem).text());
});
我的 background.js 中的 blockedURLS 显示为未定义。我还尝试将我的 options.html 文件指向 background.js,并将所有 js 包含在一个文件中,其中包含以下内容:
<script type="text/javascript" src="background.js"></script>
但是,当我这样做时,似乎调用了第二个 background.js,而不仅仅是指向已经运行的那个。
感觉我已经走到了死胡同,可能有一个简单的解决方案可以解决我的问题。我对 JS/chrome 扩展也很陌生。
感谢您抽出宝贵时间阅读本文!
编辑: 经过一番摆弄之后,我可以在我的 background.js 中访问我的 blockedURL 数组。但是它永远不会更新。
var blockedURLS = ["hi"] ;
var list = document.getElementById('list');
$("#saveList").click(function(e) {
e.preventDefault();
localStorage.setItem('todoList', list.innerHTML);
alertify.success("You have saved your list.");
//Pushes each element in the list from options.html into the urls array
blockedURLS = [];
$('li').each(function(i, elem) {
blockedURLS.push($(elem).text());
});
alert("Currently blocked:\n" + blockedURLS);
});
$("#reset").click(function(e) {
e.preventDefault();
localStorage.clear();
location.reload();
});
loadToDo();
function loadToDo() {
if (localStorage.getItem('todoList')){
list.innerHTML = localStorage.getItem('todoList');
}
}
应该发生的是,在我进入 options.html 并保存列表后,“hi”应该替换为我列表中的所有不同 URL。然而事实并非如此。但是,blockedURL 数组在该警报中正确打印。
【问题讨论】:
标签: javascript jquery html google-chrome google-chrome-extension