Tiện ích mở rộng của Chrome: truy cập localStorage trong tập lệnh nội dung


157

Tôi có một trang tùy chọn nơi người dùng có thể xác định các tùy chọn nhất định và nó lưu nó trong localStorage: options.html

Bây giờ, tôi cũng có một tập lệnh nội dung cần lấy các tùy chọn đã được xác định trong options.htmltrang, nhưng khi tôi cố gắng truy cập localStorage từ tập lệnh nội dung, nó không trả về giá trị từ trang tùy chọn.

Làm cách nào để làm cho tập lệnh nội dung của tôi nhận được các giá trị từ localStorage, từ trang tùy chọn hoặc thậm chí trang nền?




Câu trả lời:


233

Cập nhật 2016:

Google Chrome đã phát hành API lưu trữ: http://developer.chrome.com/extensions/st Storage.html

Nó khá dễ sử dụng như các API Chrome khác và bạn có thể sử dụng nó từ bất kỳ bối cảnh trang nào trong 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);
    });

Để sử dụng nó, hãy chắc chắn rằng bạn xác định nó trong tệp kê khai:

    "permissions": [
      "storage"
    ],

Có các phương pháp để "xóa", "xóa", "getBytesInUse" và trình lắng nghe sự kiện để lắng nghe lưu trữ đã thay đổi "onChanged"

Sử dụng localStorage riêng ( trả lời cũ từ năm 2011 )

Các kịch bản nội dung chạy trong ngữ cảnh của các trang web, không phải các trang mở rộng. Do đó, nếu bạn đang truy cập localStorage từ nội dung của mình, thì đó sẽ là bộ lưu trữ từ trang web đó, không phải là bộ lưu trữ trang mở rộng.

Bây giờ, để cho tập lệnh nội dung của bạn đọc bộ nhớ mở rộng của bạn (nơi bạn đặt chúng từ trang tùy chọn của mình), bạn cần sử dụng thông báo tiện ích mở rộng .

Điều đầu tiên bạn làm là yêu cầu tập lệnh nội dung của bạn gửi yêu cầu đến tiện ích mở rộng của bạn để tìm nạp một số dữ liệu và dữ liệu đó có thể là tiện ích mở rộng localStorage của bạn:

nội dung.js

chrome.runtime.sendMessage({method: "getStatus"}, function(response) {
  console.log(response.status);
});

nền.js

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.method == "getStatus")
      sendResponse({status: localStorage['status']});
    else
      sendResponse({}); // snub them.
});

Bạn có thể thực hiện một API xung quanh đó để nhận dữ liệu localStorage chung vào tập lệnh nội dung của bạn hoặc có thể lấy toàn bộ mảng localStorage.

Tôi hy vọng điều đó đã giúp giải quyết vấn đề của bạn.

Để được ưa thích và chung chung ...

nội dung.js

chrome.runtime.sendMessage({method: "getLocalStorage", key: "status"}, function(response) {
  console.log(response.data);
});

nền.js

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.method == "getLocalStorage")
      sendResponse({data: localStorage[request.key]});
    else
      sendResponse({}); // snub them.
});

1
Rõ ràng, yêu cầu cũng có thể là {phương thức: 'getStorage', khóa: 'status'} và người nghe sẽ phản hồi với dữ liệu tương ứng.
JC Inacio

Điều gì xảy ra nếu tôi muốn mọi thứ từ localStorage được chuyển sang phần mở rộng? Tôi có thể viết sendResponse({data: localStorage});không
Bibhas Debnath

Tôi hơi bối rối. Tôi muốn dữ liệu từ trang tùy chọn của mình khả dụng tại trang background.html .. Vì vậy, tôi có yêu cầu từ trang Nền đến nội dung không? và nội dung có thể gửi lại dữ liệu localStorage? Xem cái này -> pastebin.com/xtFexFtc .. Tôi đang làm đúng không?
Bibhas Debnath

7
Trang nền và trang tùy chọn thuộc cùng một bối cảnh mở rộng, vì vậy bạn không cần tập lệnh nội dung hoặc nhắn tin. Bạn có thể gọi localStoragetrực tiếp từ trang tùy chọn hoặc sử dụng chrome.extension.getBackgroundPagetừ trang tùy chọn.
Mohamed Mansour

1
Đó là lạ. Tôi đang thiết lập một vài tùy chọn trong trang tùy chọn và tạo các menu ngữ cảnh dựa trên chúng trong trang nền. Vấn đề là, nếu tôi đặt một biến trong localStorage từ trang tùy chọn, nó sẽ không được phản ánh ngay lập tức đến trang nền (tức là Không có ngữ cảnh mới), trừ khi tôi tắt và bật lại tiện ích mở rộng. Bất kỳ lý do bạn có thể nghĩ đến?
Bibhas Debnath

47

Đôi khi có thể tốt hơn khi sử dụng API chrome.st Storage . Tốt hơn là localStorage vì bạn có thể:

  • lưu trữ thông tin từ tập lệnh nội dung của bạn mà không cần thông báo chuyển giữa tập lệnh nội dung và phần mở rộng;
  • lưu trữ dữ liệu của bạn dưới dạng các đối tượng JavaScript mà không tuần tự hóa chúng thành JSON ( localStorage chỉ lưu trữ chuỗi ).

Đây là một mã đơn giản thể hiện việc sử dụng chrome.st Storage. Tập lệnh nội dung lấy url của trang đã truy cập và dấu thời gian và lưu trữ nó, popup.js lấy nó từ vùng lưu trữ.

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

"Thay đổi" ở đây là một đối tượng chứa giá trị cũ và mới cho một khóa đã cho. Đối số "AreaName" đề cập đến tên của vùng lưu trữ, 'cục bộ', 'đồng bộ hóa' hoặc 'được quản lý'.

Hãy nhớ khai báo quyền lưu trữ trong manifest.json.

manifest.json

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

Sự onChangedkiện này đã cung cấp dữ liệu trong changesđối tượng. Hơn nữa, đặc biệt chú ý đến namespacecác onChangedsự kiện. Nếu bạn lưu trữ một cái gì đó bằng cách sử dụng chrome.storage.local.set, thì onChangedsự kiện được kích hoạt, nhưng đọc bằng cách sử dụng chrome.storage.sync.getrất ít ý nghĩa.
Rob W

Có bạn đúng, chỉnh sửa câu trả lời của tôi. Rõ ràng bạn có thể sử dụng chrome.st Storage.sync.get trong các tình huống khác, nhưng ở đây nó thực sự là dư thừa.
Pawel Miech

Đáp lại bản sửa đổi 5 trong câu trả lời của bạn: changes.visitedPagessẽ không được xác định nếu visitedPageschưa được thay đổi. Bọc dòng trong if (changes.visitedPages) { ... }để giải quyết vấn đề này.
Rob W

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.