Estensione di Chrome: accesso a localStorage nello script dei contenuti


157

Ho una pagina di opzioni in cui l'utente può definire determinate opzioni e lo salva in localStorage: options.html

Ora ho anche uno script di contenuto che deve ottenere le opzioni definite nella options.htmlpagina, ma quando provo ad accedere a localStorage dallo script di contenuto, non restituisce il valore dalla pagina delle opzioni.

Come posso fare in modo che il mio script di contenuto ottenga valori da localStorage, dalla pagina delle opzioni o anche dalla pagina di sfondo?




Risposte:


233

Aggiornamento 2016:

Google Chrome ha rilasciato l'API di archiviazione: http://developer.chrome.com/extensions/storage.html

È abbastanza facile da usare come le altre API di Chrome e puoi usarlo da qualsiasi contesto di pagina all'interno di 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);
    });

Per usarlo, assicurati di definirlo nel manifest:

    "permissions": [
      "storage"
    ],

Esistono metodi per "rimuovere", "cancella", "getBytesInUse" e un listener di eventi per ascoltare la memoria modificata "onChanged"

Utilizzo di LocalStorage nativo ( vecchia risposta dal 2011 )

Gli script di contenuto vengono eseguiti nel contesto di pagine Web, non di pagine di estensione. Pertanto, se accedi a localStorage dal tuo indice, sarà l'archiviazione da quella pagina web, non l'archiviazione della pagina di estensione.

Ora, per consentire allo script di contenuti di leggere la memoria dell'estensione (dove li hai impostati dalla pagina delle opzioni), devi utilizzare il passaggio dei messaggi di estensione .

La prima cosa da fare è dire al tuo script di contenuto di inviare una richiesta alla tua estensione per recuperare alcuni dati e che tali dati possono essere la tua estensione 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.
});

È possibile eseguire un'API per ottenere dati generici localStorage nello script del contenuto o, forse, ottenere l'intero array localStorage.

Spero che ciò abbia contribuito a risolvere il tuo problema.

Essere fantasiosi e generici ...

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.
});

1
Ovviamente, la richiesta potrebbe anche essere {method: 'getStorage', key: 'status'} e il listener avrebbe risposto con i dati corrispondenti.
JC Inacio,

Cosa succede se desidero trasferire tutto dall'archivio localSportage all'estensione? Posso scrivere sendResponse({data: localStorage});?
Bibhas Debnath,

Sono un po 'confuso. Voglio che i dati dalla mia pagina delle opzioni siano disponibili nella pagina background.html .. Quindi faccio una richiesta dalla pagina Background al contenuto? e contentscript può rispedire i dati localStorage? Vedi questo -> pastebin.com/xtFexFtc .. Lo sto facendo bene?
Bibhas Debnath,

7
La pagina di sfondo e la pagina delle opzioni appartengono allo stesso contesto di estensione, quindi non sono necessari script di contenuto o messaggi. È possibile chiamare localStoragedirettamente dalla pagina delle opzioni o utilizzare chrome.extension.getBackgroundPagedalla pagina delle opzioni.
Mohamed Mansour,

1
È strano. Sto impostando alcune opzioni nella pagina delle opzioni e creando menu di scelta rapida basati su di essi nella pagina di sfondo. Il fatto è che, se imposto una variabile in localStorage dalla pagina delle opzioni, non viene immediatamente riflessa nella pagina di sfondo (ovvero nessun nuovo menu di scelta rapida), a meno che non disabiliti e riattivi l'estensione. Qualche motivo che ti viene in mente?
Bibhas Debnath,

47

A volte potrebbe essere meglio usare l' API chrome.storage . È meglio quindi localStorage perché puoi:

  • memorizzare le informazioni dallo script del contenuto senza la necessità di passare messaggi tra lo script del contenuto e l'estensione;
  • archivia i tuoi dati come oggetti JavaScript senza serializzarli su JSON ( localStorage archivia solo le stringhe ).

Ecco un semplice codice che dimostra l'uso di chrome.storage. Lo script di contenuto ottiene l'URL della pagina visitata e il timestamp e lo memorizza, popup.js lo ottiene dall'area di archiviazione.

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);
    })
})();

"Modifiche" qui è un oggetto che contiene un valore vecchio e nuovo per una determinata chiave. L'argomento "AreaName" si riferisce al nome dell'area di archiviazione, "local", "sync" o "managed".

Ricorda di dichiarare il permesso di archiviazione in manifest.json.

manifest.json

...
"permissions": [
    "storage"
 ],
...

L' onChangedevento fornisce già i dati changesnell'oggetto. Inoltre, prestare particolare attenzione alla namespacedella onChangedmanifestazione. Se memorizzi qualcosa usando chrome.storage.local.set, allora l' onChangedevento viene attivato, ma leggere usando chrome.storage.sync.getha poco senso.
Rob W,

Sì, hai ragione, ho modificato la mia risposta. Ovviamente puoi usare chrome.storage.sync.get in altri scenari, ma qui è davvero ridondante.
Pawel Miech,

In risposta alla revisione 5 della tua risposta: changes.visitedPagessarà indefinito se visitedPagesnon è stato modificato. Avvolgi la linea if (changes.visitedPages) { ... }per risolvere questo problema.
Rob W,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.