【问题标题】:"'localStorage' is null or not an object" Error in IE8IE8 中的“'localStorage' 为空或不是对象”错误
【发布时间】:2013-11-23 14:38:03
【问题描述】:

我有这个字符串,我正在尝试存储并获取到 localStorage,并从中检索它以便显示。 这是我的代码:

var datas = new Array;
if (navigator.appName !== 'Microsoft Internet Explorer'){
    var qsVal = document.getElementsByClassName("val");
}
else{
    var qsVal = document.querySelectorAll('.val');
}
if (navigator.appName !== 'Microsoft Internet Explorer'){
    var qsKey = document.getElementsByClassName("key");
}
else{
    var qsKey = document.querySelectorAll('.key');
}
var storedPlays;
var stuff = document.getElementById("stuff");

function pushArray(){
    for (var i=0, len = qsVal.length; i < len; i++){
    thisValue = qsVal[i].value;
    thisKey = qsKey[i].value;
    datas.push([thisValue,thisKey]);
    }
localStorage.setItem('datas', JSON.stringify(datas));
}

function showStuff(){
    storedPlays = JSON.parse(localStorage.getItem('datas'));
    document.getElementById("stuff").innerHTML = storedPlays;
}

它适用于 FF 和 Chrome,但 IE8 在我调用“showStuff”时返回“'localStorage' 为 null 或不是对象”。

有趣的是,当我调用“pushArray”时它不会给我一个错误,它也使用了“localStorage”。

我也试过使用“window.localStorage”而不是“localStorage”,它返回了同样的错误......

根据微软和 W3 的说法,IE8 应该支持 localStorage,所以有人知道问题出在哪里吗? 谢谢一百万!

EDIT - This 是代码的 jsfiddle。出于某种原因,它并没有那么好,只是为了让您感受一下代码......

【问题讨论】:

  • CanIUse.com 也认为 IE8 应该支持它。 caniuse.com/#search=local
  • 我已经添加了这个 jsfiddle:jsfiddle.net/yrhdN/2(只是改变了一些小细节以使您的代码工作)并且一切似乎都工作正常。我在IE8兼容模式下测试过IE9)
  • 在你的应用程序中加载 DOM 之前,它会不会像 document.querySelectorAll 一样触发?

标签: javascript html internet-explorer-8 local-storage


【解决方案1】:

据我了解,IE8 只为有效域提供存储空间。尝试将您的示例放在某个 Web 服务器中,它应该可以解决问题。

当我将它作为一个单独的文件进行测试时,我遇到了同样的问题,但是当我将它放在服务器中时(在我的例子中是 Tomcat),它工作得很好。

【讨论】:

  • 是的,做到了。我通过“xampp”本地服务器运行它并且它工作。谢谢!
  • 在 IE 上使用“file://”进行测试时遇到了同样的问题。将改为使用 Chrome 进行测试,然后在部署后检查 IE。
【解决方案2】:

检查您是否实际处于 IE 8 模式 - 与 quirks 或 IE 7 模式相反。最快的方法是按 F12 以调出开发工具,浏览器模式列在该选项卡的右上角。

【讨论】:

  • 我希望这是问题所在,但我确实处于 IE8 模式。
  • 你可以创建一个 jsfiddle 或其他东西以便其他人可以更轻松地提供帮助吗?
  • 我添加了帖子的链接供大家查看
  • 它不起作用,因为您的代码在 onload 中加载,但也有 var 声明。这限定了 onload 侦听器内的所有内容。我稍微修改了您的代码以在负载侦听器内部添加点击侦听器 - jsfiddle.net/yrhdN/5。然而,问题是这对我来说在 IE 8 中运行良好。
  • 您的代码在 jsfiddle 上似乎运行良好,但是当我尝试实现您的更改时,我在 chrome 中收到“Uncaught TypeError: Object [object Object] has no method 'addEvent'”错误,并且IE 中的“对象不支持此属性或方法”错误,均针对第 31 行。
【解决方案3】:

我会使用 window.localStorage 作为镜头。 IE 见Introduction to Web Storage

【讨论】:

  • 看到这个post
  • @Ibu 这意味着使用“window.localStorage.getItem” 而不仅仅是 localStorage.getItem
【解决方案4】:

你能不能在 IE 中打开开发者工具并检查 typeof json。 stringify 和 json.parse 是函数,也是本地存储。我不确定 IE 上是否存在原生 JSON。

另外你为什么将对象设置在循环内,不应该在循环外吗?

[编辑] 为您的代码 jsfiddle.net/yrhdN/2 添加了这个小提琴,一切似乎都正常。我在IE8兼容模式下测试过IE9)

[编辑] 关于这段代码的另一件事,似乎 showStuff() 中的 innerHtml 不适用于段落。将 html 从 p 更改为 div 并使用 innerText 会使事情变得更好:

<div id="stuff">
</div>


function showStuff(){
    var storedPlays    = JSON.parse(localStorage.getItem('datas'));
    document.getElementById("stuff").innerText = storedPlays;
}

这似乎只发生在 IE 中。这是一个更新的小提琴:http://jsfiddle.net/yrhdN/7/

【讨论】:

  • 我已经检查了“storage”的“typeof”——它返回了“object”。现在我检查了 JSON.stringify 和 JSON.parse,它们都返回了“function”。至于对象 - 你是对的,我把它从循环中取出来了,谢谢:)
  • 实际上,您的小提琴版本不适合我。当我在 jsfiddle 上尝试它时,按钮什么也没做,当我尝试对我的代码进行更改时,它在 IE 的第 16 行给了我一个“预期对象”错误,以及一个“未捕获的 ReferenceError:$ 未定义” chrome中同一行的错误。我已经包括了 jquery。顺便说一句,没有 jquery 有什么办法吗?我的任务严格说没有库或框架......非常感谢!
  • fiddle options中是否加载了jQuery?
  • 你能检查我上次的编辑吗?这对您的问题有帮助吗
  • 我拿走了你的代码,只有我用除了 jquery 之外的 JS 添加了 eventListeners onload:function putPiece(){ var push = document.getElementById("push"); var pull = document.getElementById("pull"); if (window.addEventListener){ push.addEventListener('click', pushArray, false); pull.addEventListener('click', showStuff, false); } else if (window.attachEvent){ push.attachEvent('onclick', pushArray); pull.attachEvent('onclick', showStuff); } 仍然可以在 Chrome 上工作,“'localStorage' 为空或不是对象”即。
【解决方案5】:

如果您不希望任何本地服务器应用程序拍摄网页,也可以试试这个。

  • 在您的脚本中查找代码:window['localStorage'] !== null
  • 改成:window['localStorage'] != null

它在我的情况下有效。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 2011-05-27
    • 2012-10-13
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多