从内容脚本访问选项页面localStorage

时间:2013-03-29 05:18:43

标签: javascript google-chrome google-chrome-extension

我正在尝试编写一个简单的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({});
});
...

问题是我的变种quantity&永远不会将shoe_size设置为html本地存储中的“返回”值。

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

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

var留在sendMessage内。

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

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

除此之外,您可以在sendMessage回调函数内的内容脚本' auto.js'中使用console.log。它将落在控制台中,无论加载该脚本的网页是什么。