![](/img/trans.png)
[英]Why doesn't localStorage.setItem work outside of componentDidMount?
[英]localStorage setItem doesn't work on ipad
在我的hydbrid應用程序(Phonegap)中,我試圖以非常標准的方式寫入localStorage:
window.localStorage.setItem("proDB", JSON.stringify(data));
要么
window.localStorage["proDB"] = JSON.stringify(data);
但它在iPad 2(iOS 7.1)上的Safari上不起作用。
它不起作用,整個應用程序停止。
這是這個ipad的userAgent:
你能幫助我嗎 ?
謝謝
請檢查您是否在Safari中啟用了私人瀏覽功能。 在Safari私密瀏覽模式下,您獲得的配額為零。 因此,對localStorage.setItem
所有調用都將拋出超出配額的錯誤。 我個人認為這是Safari的一個巨大錯誤(正如許多網站所打破的那樣),但它就是這樣,所以我們必須找到解決方法。 我們可以這樣做:
如果你想要詳細信息請繼續閱讀:)
1:檢測功能本地存儲
我目前正在使用此代碼來檢測本地存儲是否可用,如果不是,則回退到墊片:
var DB;
try {
var x = '_localstorage_test_' + Date.now();
localStorage.setItem(x, x);
var y = localStorage.getItem(x);
localStorage.removeItem(x);
if (x !== y) {throw new Error();} // check we get back what we stored
DB = localStorage; // all fine
}
catch(e) {
// no localstorage available, use shim
DB = new MemoryStorage('my-app');
}
編輯:自寫這篇文章以來,我已經打包了功能檢測代碼。 如果您使用NPM,您可以安裝存儲 -如下所示:
npm install --save storage-available
那么你可以在你的代碼中使用它,如下所示:
if (require('storage-available')('localStorage')) {
// Yay!
}
else {
// Awwww.....
}
2.回到墊片
一旦我們檢測到問題,處理問題的最簡單方法是回退到其他一些不會在每次寫入時都拋出錯誤的對象。
memorystorage是我編寫的一個小庫,它遵循Web Storage API,但只是將所有內容存儲在內存中。 因為它使用相同的API,所以您可以將它用作localStorage的替代品,並且一切都將正常運行(盡管沒有數據可以在頁面重新加載后繼續存在)。 它是開源的,所以請隨意使用。
背景信息
有關MemoryStorage和此問題的更多信息,請閱讀我關於此主題的博客文章: MemoryStorage簡介 。
我使用swift2.2通過以下邏輯設置了本地存儲密鑰值
let jsStaring = "localStorage.setItem('Key', 'value')"
self.webView.stringByEvaluatingJavaScriptFromString(jsStaring)
你的第一個setItem示例是正確的。 我不相信你可以做第二個選項(localStorage [“someKey”] =“someValue”)。 堅持第一個。
你提到混合 - 它是PhoneGap還是其他框架? 應用程序中的哪個位置調用localStorage.setItem? 如果是PhoneGap,請確保在嘗試訪問localStorage之前先通過onDeviceReady加載了所有內容:
<script type="text/javascript">
// Wait for PhoneGap to load
document.addEventListener("deviceready", onDeviceReady, false);
// PhoneGap is ready
function onDeviceReady() {
window.localStorage.setItem("key", "value");
}
</script>
此外,如果應用程序凍結/停止工作,根據我的經驗,這是因為代碼中的某個位置正在訪問未定義的對象。 也許通過檢查localStorage是否未定義並記錄它來嘗試一些調試? 您是否100%確定“setItem”行是否失敗? Console.log是你的朋友,證明一下! :)
if (localStorage === undefined) {
console.log("oops, localStorage not initialized yet.");
}
else {
window.localStorage.setItem("proDB", JSON.stringify(data));
console.log("localStorage available.");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.