2011-07-06 95 views
2

當您使用Html5時,localStorage值以字符串形式存儲。如果您想存儲複選框的狀態並在稍後恢復,則需要處理這些事宜。我希望這樣的事情會的工作:JS:可以將「false」類型強制爲false嗎?

(function() { 
    function e(id) { return document.getElementById(id); } 

    e('save').addEventListener('click', function() { 
    localStorage['check-value'] = e('checkbox').checked 
    }) 
    e('checkbox').checked = localStorage['check-value']; 
})(); 

但似乎「校驗值」將存儲沿"false"線的東西,如果沒有選中該複選框和字符串"false"得到類型強制轉換爲true在倒數第二行。我知道我可以做一個小測驗,但這是一個愛好項目,如果可能的話我想弄明白。可以"false"被強制爲false

我沒有使用這個BTW的庫,因爲它的鉻擴展,我想保持輕量級。

回答

3

「false」只是一個像其他任何字符串,你需要在這裏做你自己的檢查。

+0

它不同於「」這是一個falsy價值:) – 2011-07-06 04:35:49

+1

事實上,我想我應該說這個'假'沒有特別的意義 –

0

改變這一行:

e('checkbox').checked = localStorage['check-value']; 

這樣:

e('checkbox').checked = localStorage['check-value'] == "true"; 

還是取決於你想要什麼:

e('checkbox').checked = localStorage['check-value'] != "false"; 

如果你這樣做超過幾次,包布爾本地存儲訪問一個微小的函數,只返回布爾值true或false。

function tfStr(val) { 
    return(val === "true"); 
} 
2

您可以嘗試使用JSON.parse來提取該值。理想情況下,您還可以使用JSON.stringify來序列化對象等。您可以通過將它抽象到其他某個接口後面來使其更易於管理。

JSON.parse("false") == false 

例如用於包裝:

var LocalStorageManager = new (function() { 
    this.set = function (key, object) { 
     localStorage[key] = JSON.stringify(object); 
    }; 

    this.get = function (key) { 
     return JSON.parse(localStorage[key]); 
    }; 
}); 
+0

我想說這可能會導致問題,但支持localStorage的瀏覽器也應該支持JSON – AlicanC

+0

是的,有這個想法,我想我不想調用JSON。經常解析這是一個字符ome擴展,因此它可以在每一頁上運行。 –

+0

@George Mauer:試試吧。除非你有很多數據,否則用戶甚至不可能注意到'JSON.parse'和朋友的小開銷。 –

3

您可以測試它是否等於字符串「假」:

e('checkbox').checked = localStorage['check-value'] != 'false'; 

或者,你可以在你面前它強制爲數字存儲和檢索後:

localStorage['check-value'] = +e('checkbox').checked 
// ... 
e('checkbox').checked = +localStorage['check-value'] 
+0

我一直在想一些強迫數字的東西,但我不認爲你的代碼會工作'var str =「false」; + str;'在控制檯輸出NaN –

+0

它強制執行兩次。所以在你存儲之前,'false'會被轉換爲'0'。然後,當您檢索它時,字符串「0」被強制回到數字「0」,JavaScript變成「false」。 –

1

你不能在JS上這麼做。你應該使用var boolValue = (stringValue !== 'false')或任何漂浮你的船。

0

只是riffing在這裏,但你可以做一些真的傻得像

eval(localStorage['check-value'])

如果字符串爲假時,將計算結果爲布爾值false。顯然你不想這樣做,因爲這是一個重大的安全漏洞。

或者,您也可以使用三元運算符:

(localStorage['check-value']==="false")?false:localStorage['check-value'];

+0

嗯實際上這很有趣 - 會不會是一個安全漏洞?我並不清楚localStorage規則,但它似乎是唯一一個存在於您的域中的代碼。因此,如果惡意代碼在localStorage中,意味着它已經有機會運行並造成損壞......我在這一推理中錯了嗎? –

0

你可以使用/true/i.test(localStorage['check-value'])

相關問題