3

我正在尝试编写一个简单的 chrome 扩展,但在尝试从我的内容脚本“auto.js”访问 options.html 的本地存储时遇到了一些困难。

根据我收集到的信息(谷歌搜索和阅读 Chrome 令人困惑的文档),这只能通过以下方式实现:

chrome.runtime.sendMessage & chrome.runtime.onMessage.addListener

内容脚本“auto.js”:

var quantity   = ""
var shoe_size  = ""

function addToCart() {

chrome.runtime.sendMessage({localstorage: "qty"}), function(response){
    var quantity = response.qty;
}

chrome.runtime.sendMessage({localstorage: "size"}), function(response){
    var shoe_size = response.size;
}
...

我在“options.js”中的听众:

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse){

  if(request.localstorage == "qty")
    sendResponse({qty: localStorage.qty});
  else if(request.localstorage == "size")
    sendResponse({size: localStorage.size});
  else
    sendResponse({});
});
...

问题是我的 vars quantity&shoe_size从未设置为 html 本地存储中的“返回”值。

我的 js 控制台中没有给出错误,我不确定如何调试它。非常感谢任何反馈。

4

2 回答 2

3

那是因为 sendMessage 之后的代码在 sendMessage 被触发后立即运行。它们已设置,但不会等待响应,它们是在您需要它们的时间之后设置的。我在这里有同样的问题Synchronously get Stored data from content scripts。为了解决它,你可以在里面放任何你想要的功能

chrome.runtime.sendMessage({localstorage: "qty"}), function(response){
    var quantity = response.qty;
}

为了看到它设置,测试这个:

chrome.runtime.sendMessage({localstorage: "qty"}), function(response){
    var quantity = response.qty;
}

alert("waiting for a second, to make sure that response is ready ...");
alert("Not it is set:" + quantity);
于 2013-03-29T05:40:44.427 回答
0

您在sendMessage 回调函数中var quantity = response.qty;使用前面的内容编写。var巧合的是,这将创建一个与全局变量同名的局部变量。但这是一个不同的变量。并且存储它的内存将在 sendMessage 完成后立即释放,因为这只是一个本地范围。

离开var里面的sendMessage。

此外,您缺少这些全局变量上的分号。

var quantity   = "";
var shoe_size  = "";

除此之外,您可以console.log在 sendMessage 回调函数内的内容脚本“auto.js”中使用。它将登陆正在加载该脚本的任何网页的控制台。

于 2014-04-25T22:34:29.237 回答