我有一个选项页面,在那里用户可以定义某些选项,并将其保存在localStorage中:options.html
现在,我还有一个内容脚本需要获取在options.html
页面中定义的选项,但是当我尝试从内容脚本访问localStorage时,它不返回来自选项页面的值。
我如何让我的内容脚本从localStorage获取值,无论是来自选项页面还是后台页面?
我有一个选项页面,在那里用户可以定义某些选项,并将其保存在localStorage中:options.html
现在,我还有一个内容脚本需要获取在options.html
页面中定义的选项,但是当我尝试从内容脚本访问localStorage时,它不返回来自选项页面的值。
我如何让我的内容脚本从localStorage获取值,无论是来自选项页面还是后台页面?
谷歌浏览器发布了存储 API:https://developer.chrome.com/docs/extensions/reference/storage/
它与其他 Chrome API 一样易于使用,您可以在 Chrome 的任何页面上下文中使用它。
// Save it using the Chrome extension storage API.
chrome.storage.sync.set({'foo': 'hello', 'bar': 'hi'}, function() {
console.log('Settings saved');
});
// Read it using the storage API
chrome.storage.sync.get(['foo', 'bar'], function(items) {
message('Settings retrieved', items);
});
要使用它,请确保在清单文件中定义: "permissions": [
"storage"
],
有一些方法可以“删除”、“清除”、“获取使用的字节数”,以及一个事件监听器来监听存储变化“onChanged”。
内容脚本在网页的上下文中运行,而不是扩展页面。因此,如果您从内容脚本访问localStorage,它将是该网页的存储,而不是扩展页面的存储。
现在,要让您的内容脚本读取您的扩展存储(您从选项页面设置的存储),您需要使用扩展消息传递。
首先,您需要告诉内容脚本向您的扩展发送请求来获取一些数据,而这个数据可以是您的扩展localStorage:
contentscript.js
chrome.runtime.sendMessage({method: "getStatus"}, function(response) {
console.log(response.status);
});
background.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.method == "getStatus")
sendResponse({status: localStorage['status']});
else
sendResponse({}); // snub them.
});
你可以围绕此功能编写API,以获取通用的localStorage数据到你的内容脚本中,或者获取整个localStorage数组。我希望这能解决你的问题。
为了更加高端和通用...
contentscript.js
chrome.runtime.sendMessage({method: "getLocalStorage", key: "status"}, function(response) {
console.log(response.data);
});
background.js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.method == "getLocalStorage")
sendResponse({data: localStorage[request.key]});
else
sendResponse({}); // snub them.
});
localStorage
或者在选项页中使用 chrome.extension.getBackgroundPage
。 - Mohamed Mansourcontent_script.js
(function () {
var visited = window.location.href;
var time = +new Date();
chrome.storage.sync.set({'visitedPages':{pageUrl:visited,time:time}}, function () {
console.log("Just visited",visited)
});
})();
弹出窗口.js
(function () {
chrome.storage.onChanged.addListener(function (changes,areaName) {
console.log("New item in storage",changes.visitedPages.newValue);
})
})();
"Changes" 这里是一个包含给定键的旧值和新值的对象。 "AreaName" 参数指的是存储区域的名称,可以是 'local'、'sync' 或 'managed'。
记得在 manifest.json 中声明存储权限。
manifest.json
...
"permissions": [
"storage"
],
...
onChanged
事件已经在changes
对象中提供了数据。此外,特别注意onChanged
事件的namespace
。如果您使用chrome.storage.local.set
存储某些内容,则会触发onChanged
事件,但是使用chrome.storage.sync.get
读取则没有太大意义。 - Rob WvisitedPages
,则changes.visitedPages
将为未定义。在该行中加入if (changes.visitedPages) { ... }
即可解决此问题。 - Rob W另一种选择是使用chromestorage API。这允许用户数据的存储,并可选择在会话之间同步。
一个缺点是它是异步的。
"permissions": ["scripting"]
let [tab] = await chrome.tabs.query({ active: true, currentWindow: true })
// Execute script in the current tab
const fromPageLocalStore = await chrome.scripting.executeScript({
target: { tabId: tabId },
func: () => {
return JSON.stringify(localStorage)
}
})
const localStorageItems = JSON.parse(fromPageLocalStore[0].result)