2012-04-08 2 views
2

크롬 확장 프로그램에서 작업 중이며 로컬 저장소에 정보를 성공적으로 저장할 수 있지만 로컬 저장소에 일단 정보가 실제로 액세스됩니다. 내가 반환하지 않은 것은 NULL이라고 말합니다.크롬 확장자를 사용하여 localstorage에 액세스하는 방법

두 파일 : options.html 및 content.js가 있습니다. options.html은 사용자가 로컬 스토리지에 저장할 정보를 입력하는 곳이며 content.js는 사용할 정보에 액세스합니다.

options.html

$(function() { 
    // Insert new buttons (you'd probably not ACTUALLY use buttons, instead saving on blurs or every x seconds) 
    $("#save_buttons").after("<input type='submit' value='Save Form' id='saveData'>").after("<input type='submit' value='Clear Saved Data' id='clearData'>"); 
    $("#saveData").click(function(e) { 
     // Don't actually submit form 
     e.preventDefault(); 

     // Bit of generic data to test if saved data exists on page load 
     localStorage.setItem("flag", "set"); 

     // serializeArray is awesome and powerful 
     var data = $("#hanes").serializeArray(); 

     // iterate over results 
     $.each(data, function(i, obj) { 
      // HTML5 magic!! 
      localStorage.setItem(obj.name, obj.value); 
     }); 
    }); 

    // Test if there is already saved data 
    if (localStorage.getItem("flag") == "set") { 
     // Tell the user 
     $("header").before("<p id='message'>This form has saved data!</p>"); 

     // Same iteration stuff as before 
     var data = $("#hanes").serializeArray(); 

     // Only the only way we can select is by the name attribute, but jQuery is down with that. 
     $.each(data, function(i, obj) { 
      $("[name='" + obj.name +"']").val(localStorage.getItem(obj.name)); 
     }); 
    } 

    // Provide mechanism to remove data. You'd probably actually remove it not just kill the flag 
    $("#clearData").click(function(e) { 
     e.preventDefault(); 
     localStorage.setItem("flag", ""); 
    }); 
}); 


<form id="hanes" name="hanes"> 
First name: <input type="text" name="firstname" id="firstname" /><br /> 
Last name: <input type="text" name="lastname" /><br /> 
Address: <input type="text" name="address" /><br /> 
City: <input type="text" name="city" /><br /> 
</form> 

background.html

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    if (request.method == "firstname") 
     sendResponse({status: localStorage['firstname']}); 
    else 
     sendResponse({}); 
}); 

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    if (request.method == "lastname") 
     sendResponse({status: localStorage['lastname']}); 
    else 
     sendResponse({}); 
}); 

content.js

chrome.extension.sendRequest({method: "firstname"}, function(response) { 
    alert(response.status); 
}); 

chrome.extension.sendRequest({method: "lastname"}, function(response) { 
    alert(response.status); 
}); 
+0

'options.html'에서 [resources 탭] (https://developers.google.com/chrome-developer-tools/docs/resources)을 보면 localstorage에서 예상대로 데이터를 볼 수 있습니까? – abraham

+0

@abraham 예, 로컬 저장소 아래의 자원 탭에있는 모든 데이터를 볼 수 있으며'메시지 전달 '으로 작업 할 수 있습니다. 코드를 업데이트하여 로컬 스토리지에서 각 데이터를 호출하는 방법을 설명 할 수 있습니까? 모든 것을 호출하는 방법을 모르겠습니다. 나는 전화하는 법 밖에 모른다. –

답변

5

콘텐츠 스크립트는 확장 영역 (Chrome extension code vs Content scripts vs Injected scripts) 외부의 자체 세계에서도 실행됩니다. 콘텐츠 스크립트는 확장 프로그램의 localStorage에 액세스 할 수 없습니다.
메시지 전달 (http://code.google.com/chrome/extensions/messaging.html)을 사용하여 배경 페이지와 통신해야하거나 배경 페이지를 사용하지 않으려는 경우 iFrame 트릭 (Options-enabled content-script Chrome extension without background page?)을 사용할 수 있습니다.

+0

아브라함은 대괄호 대신 괄호를 사용하는 것이 옳았지 만 이것이 답입니다. 콘텐츠 스크립트의'localStorage'는 그것이 삽입 된 페이지의'localStorage'를 참조합니다. –

+0

@PAEz'message passing' 감사합니다.하지만 어떻게 로컬 저장소의 모든 데이터에 액세스합니까? 코드를 업데이트했습니다. –

+0

@ Mr.1.0 나는 당신의 코드를 시험해 보지 못했지만 그것은 나에게 잘 보인다. 한 번의 호출로 모든 localStorage에 액세스하는 방법을 묻는다면'JSON.stringify (localStorage)'를 수행하여 콘텐츠 스크립트로 다시 보낼 수있을 것입니다. 일반적으로 이드는 단지 내가 원하는 모든 것을 가진 객체를 만들고 그 문자열을 컨텐트 스크립트에 보냅니다. – PAEz

0

사용 대신

var fname = window.localStorage.getItem('firstname'); 
+0

또한 나에게 'null'을줍니다. –

관련 문제