Mam stronę opcji, na której użytkownik może definiować pewne opcje i zapisuje ją w localStorage: options.html
Teraz mam także skrypt zawartości, który musi pobrać opcje zdefiniowane na options.html
stronie, ale kiedy próbuję uzyskać dostęp do localStorage ze skryptu zawartości, nie zwraca wartości ze strony opcji.
Jak sprawić, by mój skrypt zawartości pobierał wartości z localStorage, ze strony opcji, a nawet strony w tle?
google-chrome-extension
local-storage
content-script
user476214
źródło
źródło
Odpowiedzi:
Aktualizacja 2016:
Google Chrome udostępnił interfejs API do przechowywania danych: http://developer.chrome.com/extensions/storage.html
Jest dość łatwy w użyciu, podobnie jak inne interfejsy API Chrome i możesz go używać z dowolnego kontekstu strony w Chrome.
Aby z niego skorzystać, upewnij się, że zdefiniowałeś go w manifeście:
Istnieją metody „usuwania”, „czyszczenia”, „getBytesInUse” i nasłuchiwania zdarzeń do nasłuchiwania zmienionej pamięci „onChanged”
Korzystanie z natywnego localStorage ( stara odpowiedź z 2011 r. )
Skrypty zawartości działają w kontekście stron internetowych, a nie stron rozszerzeń. Dlatego jeśli uzyskujesz dostęp do localStorage ze swojego skryptu contentcript, będzie to pamięć z tej strony internetowej, a nie pamięć strony rozszerzenia.
Teraz, aby pozwolić skryptowi zawartości na odczytanie pamięci rozszerzeń (gdzie ustawiasz je na stronie opcji), musisz użyć przekazywania wiadomości rozszerzenia .
Pierwszą rzeczą, którą musisz zrobić, jest poinformowanie skryptu zawartości, aby wysłał żądanie do twojego rozszerzenia w celu pobrania niektórych danych, a te dane mogą być twoim rozszerzeniem localStorage:
contentcript.js
background.js
Możesz zastosować interfejs API, aby uzyskać ogólne dane localStorage do skryptu zawartości lub być może pobrać całą tablicę localStorage.
Mam nadzieję, że pomogło to rozwiązać Twój problem.
Aby być fantazyjnym i ogólnym ...
contentcript.js
background.js
źródło
sendResponse({data: localStorage});
?localStorage
bezpośrednio ze strony opcji lub użyćchrome.extension.getBackgroundPage
ze strony opcji.Czasami lepiej jest użyć interfejsu API chrome.storage . Lepiej niż localStorage, ponieważ możesz:
Oto prosty kod demonstrujący użycie chrome.storage. Skrypt treści pobiera adres URL odwiedzanej strony i sygnaturę czasową i przechowuje je, a popup.js pobiera z magazynu.
content_script.js
popup.js
„Zmiany” to obiekt zawierający starą i nową wartość dla danego klucza. Argument „AreaName” odnosi się do nazwy obszaru pamięci, „lokalny”, „synchronizacja” lub „zarządzany”.
Pamiętaj, aby zadeklarować zezwolenie na przechowywanie w pliku manifest.json.
manifest.json
źródło
onChanged
Wydarzenie już dostarcza danych wchanges
obiekcie. Ponadto zwróć szczególną uwagęnamespace
naonChanged
wydarzenie. Jeśli przechowujesz coś przy użyciuchrome.storage.local.set
,onChanged
zdarzenie jest wyzwalane, ale czytanie za pomocąchrome.storage.sync.get
nie ma sensu.changes.visitedPages
będzie niezdefiniowana, jeślivisitedPages
nie została zmieniona. Zawiń linię,if (changes.visitedPages) { ... }
aby rozwiązać ten problem.Inną opcją byłoby użycie interfejsu API chromestorage. Pozwala to na przechowywanie danych użytkownika z opcjonalną synchronizacją między sesjami.
Jedną wadą jest to, że jest asynchroniczny.
https://developer.chrome.com/extensions/storage.html
źródło