Chrome 확장 프로그램 : 콘텐츠 스크립트에서 localStorage에 액세스


157

사용자가 특정 옵션을 정의하고 localStorage에 저장하는 옵션 페이지가 있습니다. options.html

이제 options.html페이지에 정의 된 옵션을 가져와야하는 콘텐츠 스크립트가 있지만 콘텐츠 스크립트에서 localStorage에 액세스하려고하면 옵션 페이지에서 값을 반환하지 않습니다.

컨텐츠 스크립트가 localStorage, 옵션 페이지 또는 백그라운드 페이지에서 값을 가져 오려면 어떻게해야합니까?




답변:


233

2016 업데이트 :

구글 크롬은 스토리지 API를 공개했다 : http://developer.chrome.com/extensions/storage.html

다른 Chrome 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 사용 ( 2011 년 이전 응답 )

콘텐츠 스크립트는 확장 페이지가 아닌 웹 페이지의 컨텍스트에서 실행됩니다. 따라서 컨텐츠 스크립트에서 localStorage에 액세스하는 경우 확장 페이지 저장소가 아닌 해당 웹 페이지의 저장소가됩니다.

이제 콘텐츠 스크립트가 확장 프로그램 (옵션 페이지에서 설정 한 확장 프로그램)을 읽을 수있게하려면 확장 메시지 전달 을 사용해야합니다 .

가장 먼저 할 일은 콘텐츠 스크립트가 확장에 요청을 보내 데이터를 가져 오도록 지시하는 것이며 그 데이터는 확장 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);
});

background.js

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

1
분명히 요청은 {method : 'getStorage', 키 : 'status'} 일 수 있으며 리스너는 해당 데이터로 응답합니다.
JC Inacio

localStorage의 모든 항목을 확장으로 전송하려면 어떻게해야합니까? 쓸 수 있습니까 sendResponse({data: localStorage});?
Bibhas Debnath

조금 혼란 스러워요. 옵션 페이지의 데이터를 background.html 페이지에서 사용할 수 있기를 원합니다. 따라서 백그라운드 페이지에서 콘텐츠 스크립트로 요청합니까? contentscript는 localStorage 데이터를 다시 보낼 수 있습니까? this- > pastebin.com/xtFexFtc를 참조하십시오 . 올바르게 수행하고 있습니까?
Bibhas Debnath

7
백그라운드 페이지와 옵션 페이지는 동일한 확장 컨텍스트에 속하므로 컨텐츠 스크립트 나 메시징이 필요하지 않습니다. localStorage옵션 페이지에서 직접 전화 하거나 옵션 페이지에서 사용할 수 있습니다 chrome.extension.getBackgroundPage.
Mohamed Mansour

1
이상하다. 옵션 페이지에서 몇 가지 옵션을 설정하고 백그라운드 페이지에서 옵션을 기반으로 컨텍스트 메뉴를 작성하고 있습니다. 문제는 옵션 페이지에서 localStorage에 변수를 설정하면 확장을 비활성화하고 다시 활성화하지 않으면 배경 페이지에 즉시 반영되지 않습니다 (즉, 새로운 컨텍스트 메뉴 없음). 당신이 생각할 수있는 어떤 이유가 있습니까?
Bibhas Debnath

47

때로는 chrome.storage API 를 사용하는 것이 좋습니다 . localStorage보다 낫습니다.

  • 컨텐츠 스크립트와 확장간에 메시지를 전달할 필요없이 컨텐츠 스크립트의 정보를 저장합니다 .
  • 데이터 를 JSON으로 직렬화하지 않고 JavaScript 객체로 저장합니다 ( 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"인수는 저장 영역의 이름 ( 'local', 'sync'또는 'managed')을 나타냅니다.

manifest.json에서 스토리지 권한을 선언해야합니다.

manifest.json

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

onChanged이벤트가 이미있는 데이터를 제공하는 changes객체입니다. 또한, 특별한주의를 지불 namespaceonChanged이벤트입니다. 을 사용하여 무언가를 저장 chrome.storage.local.set하면 onChanged이벤트가 트리거되지만을 사용하여 읽는 chrome.storage.sync.get것은 의미가 없습니다.
Rob W

예, 맞습니다. 제 답변을 편집했습니다. 분명히 다른 시나리오에서 chrome.storage.sync.get을 사용할 수 있지만 여기서는 실제로 중복됩니다.
Pawel Miech

답변의 개정 5에 응답하여 : 변경 changes.visitedPages되지 않은 경우 정의되지 visitedPages않습니다. if (changes.visitedPages) { ... }이 문제를 해결 하려면 줄을 감싸십시오 .
Rob W

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.