Javascript localStorage setItem没有';我不能在ipad上工作

Javascript localStorage setItem没有';我不能在ipad上工作,javascript,ios,html,web-storage,Javascript,Ios,Html,Web Storage,在我的hydbrid应用程序(Phonegap)中,我尝试以非常标准的方式写入localStorage: window.localStorage.setItem("proDB", JSON.stringify(data)); 或 但它在iPad2(iOS7.1)上的Safari上不起作用 它不工作,整个应用程序停止 以下是这款ipad的用户代理: 你能帮我吗 谢谢您的第一个设置项示例是正确的。不过,我不相信你能做第二个选择(localStorage[“someKey”]=“someValue”

在我的hydbrid应用程序(Phonegap)中,我尝试以非常标准的方式写入localStorage:

window.localStorage.setItem("proDB", JSON.stringify(data));

但它在iPad2(iOS7.1)上的Safari上不起作用

它不工作,整个应用程序停止

以下是这款ipad的用户代理:

你能帮我吗


谢谢

您的第一个设置项示例是正确的。不过,我不相信你能做第二个选择(localStorage[“someKey”]=“someValue”)。坚持第一条

你提到混合型——是PhoneGap还是其他框架?您在应用程序中的何处调用localStorage.setItem?如果是PhoneGap,请确保在尝试访问本地存储之前,首先通过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>

请检查您是否在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。退回到垫片上

    一旦我们检测到问题,处理该问题的最简单方法是退回到某个不会在每次写入时抛出错误的其他对象

    是我编写的一个小库,它遵循了。因为它使用相同的API,所以您可以使用它作为localStorage的替代品,一切都会正常工作(尽管没有数据会在页面重新加载后仍然有效)。它是开源的,所以可以随意使用

    背景信息


    有关MemoryStorage和此问题的更多信息,请阅读我关于此主题的博文:。

    我已使用swift2.2通过以下逻辑设置了本地存储键值

    let jsStaring = "localStorage.setItem('Key', 'value')"
    self.webView.stringByEvaluatingJavaScriptFromString(jsStaring)
    

    是stringify还是实际存储数据?AKA不
    localStorage.setItem(“proDB”、“foo”)工作?您是否超过了配额?实际上,stringify是有效的,因为如果我只写
    var temp=JSON.stringify(数据);控制台日志(temp)我得到显示的字符串。因此,似乎本地存储功能是一个问题。我只是在本地存储中写了一些东西,所以我认为我真的没有达到配额。我仍然有这个问题,有人能帮我吗?我也有这个问题。Safari私人浏览模式可能是罪魁祸首。用try-catch包装您的呼叫并打印错误。很可能是配额超出错误。Safari在私人浏览模式下将配额设置为零。不幸的是,到目前为止,我发现支持Safari私人浏览的唯一方法是使用垫片。我写了一篇你可能会觉得有用的文章:。更多关于这个主题的详细信息,请参阅我的博文:。您好@dotNetkow,谢谢您的回答。我试过两种语法,但都不起作用。我确信在我执行此操作时,框架(Phonegap)已加载。我将再次检查并调试,然后发布一个更新。最后一个猜测-您确定要在localStorage中存储字符串吗?只允许使用字符串。
    
    if (require('storage-available')('localStorage')) {
        // Yay!
    }
    else {
        // Awwww.....
    }
    
    let jsStaring = "localStorage.setItem('Key', 'value')"
    self.webView.stringByEvaluatingJavaScriptFromString(jsStaring)