我正在尝试编写一个简单的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控制台中没有给出错误,我不确定如何调试它。非常感谢任何反馈。
答案 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
。它将落在控制台中,无论加载该脚本的网页是什么。