2012-04-08 9 views
2

クロムエクステンションに取り組んでいますが、ローカルストレージに情報を正常に保存できましたが、ローカルストレージに入ったらその情報に実際にアクセスします。私が持っていないものは何も返されません。ただNULLと言います。クロムエクステンションを使用してローカルストレージにアクセスする方法

私は2つのファイル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

[resourcesタブ](https://developers.google.com/chrome-developer-tools/docs/resources)の 'options.html'を見ると、localstorageで期待どおりのデータが表示されますか? – abraham

+0

@abrahamはい、私は、ローカルストレージの下にあるリソースタブのすべてのデータを見ることができました。そして、私はそれを 'Message Passing'で動作させることができました。コードを更新して、ローカルストレージから各データをどのように呼び出すことができるかを説明することができます。それらをすべて呼び出す方法はわかりません。私は1つの方法を呼び出すだけです。 –

答えて

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私はあなたのコードを試していませんでしたが、それは私には正しいです。 1回の呼び出しですべてのlocalStorageにアクセスする方法を尋ねるなら、 'JSON.stringify(localStorage)'を実行して、それをコンテンツスクリプトに返すことができると思います。通常、Idは私が望むすべてのオブジェクトを作成し、その文字列をコンテンツスクリプトに送ります。 – PAEz

0

使用の代わりに

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

でも私には「null」が返されます –

関連する問題