Chrome uzantısı: içerik komut dosyasında localStorage'a erişme


157

Kullanıcı belirli seçenekleri tanımlayabilir ve bunu localStorage kaydeder bir seçenekler sayfası var: options.html

Şimdi, options.htmlsayfada tanımlanan seçenekleri alması gereken bir içerik komut dosyası var , ancak içerik komut dosyasından localStorage'a erişmeye çalıştığımda, seçenekler sayfasından değer döndürmüyor.

İçerik betiğimin localStorage'dan, seçenekler sayfasından ve hatta arka plan sayfasından değerleri almasını nasıl sağlayabilirim?




Yanıtlar:


233

Güncelleme 2016:

Google Chrome, depolama API'sını yayınladı: http://developer.chrome.com/extensions/storage.html

Diğer Chrome API'ları gibi kullanımı oldukça kolaydır ve Chrome'daki herhangi bir sayfa içeriğinden kullanabilirsiniz.

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

Kullanmak için manifest'te tanımladığınızdan emin olun:

    "permissions": [
      "storage"
    ],

"Kaldır", "temizle", "getBytesInUse" ve değiştirilen depolamayı "onChanged" için dinlemek için bir olay dinleyicisi vardır.

Yerel localStorage kullanma ( 2011'den eski yanıt )

İçerik komut dosyaları, uzantı sayfaları yerine web sayfaları bağlamında çalışır. Bu nedenle, contentScript'inizden localStorage'a erişiyorsanız, uzantı sayfası depolama alanı değil, bu web sayfasındaki depolama alanı olacaktır.

Şimdi, içerik komut dosyanızın uzantı depolama alanınızı okumasına izin vermek için (bunları seçenekler sayfanızdan ayarladığınız yerde), uzantı mesajı geçişini kullanmanız gerekir .

Yapmanız gereken ilk şey, içerik betiğinize bazı verileri almak için uzantınıza bir istek göndermesini söylemektir ve bu veriler localStorage uzantınız olabilir:

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

İçerik betiğinize genel localStorage verileri almak veya belki de tüm localStorage dizisini almak için bunun etrafında bir API yapabilirsiniz.

Umarım bu sorununuzu çözmenize yardımcı olmuştur.

Süslü ve genel olmak ...

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
Açıkçası, istek {method: 'getStorage', anahtar: 'status'} olabilir ve dinleyici karşılık gelen verilerle yanıt verir.
JC Inacio

LocalStorage'daki her şeyin uzantıya aktarılmasını istersem ne olur? Yazabilir miyim sendResponse({data: localStorage});?
Bibhas Debnath

Biraz kafam karıştı. Seçenekler sayfamdaki verilerin background.html sayfasında bulunmasını istiyorum. Yani Arka Plan sayfasından contentcript'e bir istekte bulunuyorum? ve contentcript localStorage verilerini geri gönderebilir mi? Şuna bakın -> pastebin.com/xtFexFtc .. Doğru mu yapıyorum?
Bibhas Debnath

7
Arka plan sayfası ve seçenekler sayfası aynı uzantı içeriğine aittir, bu nedenle içerik komut dosyalarına veya mesajlaşmaya ihtiyacınız yoktur. localStorageDoğrudan seçenekler sayfasından arayabilir veya seçenekler sayfasından kullanabilirsiniz chrome.extension.getBackgroundPage.
Mohamed Mansour

1
Bu garip. Seçenekler sayfasında birkaç seçenek ayarlıyorum ve arka plan sayfasında bunlara dayalı bağlam menüleri oluşturuyorum. Şey, seçenekler sayfasından localStorage'da bir değişken ayarlarsam, uzantıyı devre dışı bırakıp yeniden etkinleştirmedikçe, hemen arka plan sayfasına (yani Yeni bağlam menüsü yok) yansıtılmaz. Aklınıza gelebilecek herhangi bir sebep var mı?
Bibhas Debnath

47

Bazen chrome.storage API'sini kullanmak daha iyi olabilir . LocalStorage'dan daha iyidir çünkü şunları yapabilirsiniz:

İşte chrome.storage'ın kullanımını gösteren basit bir kod. İçerik betiği ziyaret edilen sayfanın ve zaman damgasının URL'sini alır ve saklar, popup.js bunu depolama alanından alır.

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

Buradaki "Değişiklikler", belirli bir anahtar için eski ve yeni değer içeren bir nesnedir. "AlanAdı" bağımsız değişkeni, 'yerel', 'eşitleme' veya 'yönetilen' depolama alanının adını belirtir.

Manifest.json dosyasında depolama izni bildirmeyi unutmayın.

manifest.json

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

onChangedOlay zaten verileri sağlar changesnesne. Ayrıca, etkinliğe özellikle dikkat namespaceedin onChanged. Eğer kullanarak bir şey saklıyorsanız chrome.storage.local.set, daha sonra onChangedolay tetiklenir, ancak kullanarak okuyor chrome.storage.sync.getküçük mantıklı.
Rob W

Evet haklısın, cevabımı düzenledim. Açıkçası chrome.storage.sync.get dosyasını diğer senaryolarda kullanabilirsiniz, ancak burada gerçekten gereksizdir.
Pawel Miech

Yanıtınızın 5. düzeltmesine yanıt olarak: değiştirilmediyse changes.visitedPagestanımsız olacaktır visitedPages. if (changes.visitedPages) { ... }Bu sorunu çözmek için hattı sarın .
Rob W

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.