2016-04-23 1 views
0

私は簡単なタスクリストを書いた。以下のJavaScriptコードは重要な部分はlocalStorageです。私がこれまでに作ったのはこれです:JSBin保存された変数と同じ型がlocalStorageから取得されていませんか?

私が達成したいのは、ページをリロードするときに、エントリをすぐに削除する必要がある場合(テキストフィールドの横のチェックボックスがオンになっているかどうか)です。最後の訪問から保存され復元されました。私は最初、私はオフにして、その後、私はそれをしたいとそれを動作させるために、もう一度チェックボックスをチェックする必要があるページを読み込ん現在

...ここ

である私はJavaScript/jQueryのコード:

var anzahl = 0; 
var autoremove = true; 
var autoremove_backup = localStorage.getItem("autoremove"); 
console.log(localStorage.getItem("autoremove")); 

$(document).ready(function() { 
    if(autoremove_backup===false){ 
    $("#autoremove").prop("checked", false); 
    } 
    else if (autoremove_backup===true){ 
    $("#autoremove").prop("checked", true); 
    } 
    autoremove = autoremove_backup; 
    setInterval(entry, 2000); 
    $("button").on('click', function() { 
    if(this.id=="add"){ 
     var r = $('<div id="'+ "div"+String(anzahl) +'"><input type="checkbox" id="'+String(anzahl)+'">' + '<label for="'+ String(anzahl)+'" id="'+ "label" +String(anzahl)+'">' + $("#task").val() + '</label><br></div>'); 
     $("#var").append(r); 
     anzahl = anzahl +1; 
    } 
    }); 
    $('input[type=checkbox]').change(
    function(){ 
     if (this.checked) { 
     if(String(this.id)==="autoremove"){ 
      autoremove=true; 
      saveAutoremove(autoremove); 
     } 
     } 
     else { 
     if(String(this.id)==="autoremove"){ 
      autoremove=false; 
      saveAutoremove(autoremove); 
     } 
     } 
    }); 

}); 

function entry(){ 
if(autoremove===true){ 
    $('#var input:checked').each(function() { 
    $("#div"+String(this.id)).remove(); 
}); 
} 
} 


function saveAutoremove(input){ 
    localStorage.setItem("autoremove", input); 
} 
+3

EVERYTHINGは 'localStorage'に**文字列**として格納されます。 – Tushar

+0

ああ、ありがとう、私はそれがいくつかの型の問題かもしれないと思った... – frankenapps

+0

文字列リテラルに何かを連結するとき、明示的に文字列にキャストする必要はありません、それは暗黙のうちにキャストされます。 '" #div "+ String(this.id)'の代わりに '' #div "+ this.id'を書くことができます。明確にするために明示的にしたいときもありますが、左にリテラルがあるときはかなり自明です。 –

答えて

1

は、それが動作していない理由は次のとおりです。

  1. 任意の値は、あなたがプリミティブ値を格納するようにすると、文字列に強制変換されlocalStorageに格納されている場合trueまたはfalseの場合は、文字列'true'および'false'に強制的に変換されます。

  2. localStorageから値を取得すると、文字列のままです。

  3. あなたの比較はtrueまたはfalseに文字列を比較するとき、結果は常にfalseなり、厳密な===比較演算子を使用しています。したがって、ifelseもtrueになりませんので、HTMLからのデフォルトのchecked属性が残ります。 ==の非厳密な比較を使用しても、意図したとおりにコードが動作するわけではないことに注意してください。これは、文字列'true''false'の両方がtrueに強制されているためです。したがって、elseブランチは常に追跡されます。

あなたはlocalStorageから取り戻す文字列の値に基づいてautoremove_backupを設定することで、それを修正することができます:

var autoremove_backup = localStorage.getItem("autoremove") === 'true' ? true : false; 

私が過去に使用した別のアプローチは、/シリアライズに保存されているすべてのものをデシリアライズすることですlocalStorageJSON.stringifyJSON.parse

function saveAutoremove(input) { 
    localStorage.setItem("autoremove", JSON.stringify(input)); 
} 

それを取得するには:それを設定するには

var autoremove_backup = JSON.parse(localStorage.getItem("autoremove")); 

それはオーバーヘッドを少し追加しますが、それは自動的にブール値にブール値に変換します。

+0

JSONのアプローチは、まさに何でも使えます。プロパティや要素を[stringify](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify)で保存できる限り、オブジェクトや配列を格納することができます。 (つまり、すべてのプロパティは列挙可能であり、関数などは含みません)。 –