所以,我有一個選項頁面,用戶可以定義某些選項並保存它的localStorage:options.html
Chrome擴展:在內容腳本訪問的localStorage
現在,我也有一個需要得到一個內容腳本在options.html
頁面中定義的選項,但是當我嘗試從內容腳本訪問localStorage時,它不返回選項頁面中的值。
如何讓我的內容腳本從localStorage,選項頁面甚至背景頁面獲取值?
所以,我有一個選項頁面,用戶可以定義某些選項並保存它的localStorage:options.html
Chrome擴展:在內容腳本訪問的localStorage
現在,我也有一個需要得到一個內容腳本在options.html
頁面中定義的選項,但是當我嘗試從內容腳本訪問localStorage時,它不返回選項頁面中的值。
如何讓我的內容腳本從localStorage,選項頁面甚至背景頁面獲取值?
谷歌瀏覽器發佈了存儲API:http://developer.chrome.com/extensions/storage.html
這是很容易使用像其他瀏覽器的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"
],
有一些方法來「刪除」,「清除」,「getBytesInUse」,以及事件偵聽器來偵聽改變存儲 「調用onChanged」
內容腳本的網頁上下文中運行,不是擴展頁面。因此,如果您從內容中訪問localStorage,它將成爲該網頁的存儲空間,而不是擴展頁面存儲空間。
現在,要讓您的內容腳本讀取您的擴展存儲(從您的選項頁面設置它們),您需要使用擴展名message passing。
你要做的第一件事就是告訴你的內容腳本的請求發送到您的擴展來獲取一些數據,而這些數據可以是您擴展的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);
});
背景。js
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
if (request.method == "getLocalStorage")
sendResponse({data: localStorage[request.key]});
else
sendResponse({}); // snub them.
});
顯然,請求也可以?{方法:「getStorage」,鍵:「狀態」},和聽衆將與相應的數據進行響應。 – 2011-05-28 01:00:11
如果我希望將localStorage中的所有內容都傳輸到擴展中,該怎麼辦?我可以寫'sendResponse({data:localStorage});'? – 2011-07-20 19:23:50
試一試,看看:) – 2011-07-21 21:15:08
另一種選擇是使用chromestorage API。這允許在跨會話進行可選同步的情況下存儲用戶數據。
一個缺點是,它是異步的。
工程就像一個魅力! – 2012-09-23 18:45:33
@Jason,那麼所有或全無**交易**呢? – Pacerier 2017-09-08 06:23:44
有時,它可能是更好的使用chrome.storage API。這是更好的話,localStorage,因爲您可以:從您的內容腳本
下面是一個演示使用chrome.storage的簡單代碼。內容腳本獲取訪問過的頁面和時間戳的url並存儲它,popup.js從存儲區域獲取它。
content_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)
});
})();
popup.js
(function() {
chrome.storage.onChanged.addListener(function (changes,areaName) {
console.log("New item in storage",changes.visitedPages.newValue);
})
})();
「更改」 這裏是包含給定鍵新舊值的對象。 「AreaName」參數是指存儲區域的名稱,可以是「本地」,「同步」或「託管」。
記住申報存儲許可manifest.json中。
manifest.json的
...
"permissions": [
"storage"
],
...
'onChanged'事件已經在'changes'對象中提供了數據。此外,要特別注意'onChanged'事件的'namespace'。如果您使用'chrome.storage.local.set'存儲了某些內容,則會觸發'onChanged'事件,但使用'chrome.storage.sync.get'讀取沒有多大意義。 – 2014-01-12 11:13:08
是的,你是對的,編輯我的答案。很明顯,你可以在其他場景中使用chrome.storage.sync.get,但這確實是多餘的。 – 2014-01-12 11:26:42
迴應你答案的第5版:如果visitedPages沒有被改變,'changes.visitedPages'將是未定義的。在'if(changes.visitedPages){...}'中包裝行來解決這個問題。 – 2014-01-12 13:41:53
相關:http://stackoverflow.com/questions/3033829/google-chrome-extension-local-storage – 2010-10-14 21:27:38
相關:http://stackoverflow.com/questions/4224039 /鉻延伸,與雲存儲 – Jason 2012-07-19 05:30:30
相關:http://stackoverflow.com/questions/39768005/single-data-store-offline-locally-for-both-a-web-site-and-an -extension-在鉻noredirect = 1#comment66832892_39768005 – super1ha1 2016-09-30 02:28:01