【问题标题】:Storing an Array in localStorage Using JSON.stringify使用 JSON.stringify 在 localStorage 中存储数组
【发布时间】:2011-03-21 21:37:16
【问题描述】:

just learned about jquery's .makeArray 我正在尝试使用 JSON.stringify 将数组存储在 localStorage 中,但我得到了意想不到的结果。

这行得通:

var links = {'one': 1, 'two': 2 };
var setstr = JSON.stringify(links);

localStorage.setItem('strlinks', setstr);
var getstr = localStorage.getItem('strlinks');
console.log(getstr); //Returns what's expected - '{"one":1, "two":2}'

这不是:

var links = $.makeArray($('a'));

alert(links); //Returns list of links
var setstr = JSON.stringify(links);

localStorage.setItem('strlinks', setstr);
var getstr = localStorage.getItem('strlinks');
console.log(getstr); //Returns '[]'

关于我做错了什么有什么想法吗?

【问题讨论】:

    标签: jquery arrays json local-storage


    【解决方案1】:

    links 包含循环引用,因此无法序列化为 JSON。 Chrome 5.0.375.99 给出错误:

    TypeError: Converting circular structure to JSON
    

    您必须以某种方式删除这些循环引用。当然,这取决于您关心的信息。这是一个简化的版本:

    var flatLinks = $.map(links, function(el)
                                 {
                                  return {href: el.href, text: el.textContent};
                                 }); 
    var setstr = JSON.stringify(flatLinks);
    

    【讨论】:

      【解决方案2】:

      $('a') 选择页面上的所有链接 (HTMLAnchorElements)。

      元素是由它们在文档中的身份和存在定义的 DOM 节点。它们不是 JSON 可以表示的简单值。如果您查看JSON.stringify() 为它们返回的内容,它只是{}:JSON 表示它所知道的关于该对象的所有信息就是它是一个Object

      尝试将节点放在localStorage 中没有任何意义;当你明天读取存储时,你期望得到什么?属于用户昨天关闭并销毁的文档的一部分的 Node 对象?

      如果您想记住链接指向的位置,您应该从它们的href 属性中获取它,作为String——localStorage 可以安全记住的简单值类型。

      【讨论】:

      • 也许我叫错了树,但这是针对 chrome 扩展的。我的想法是将数组从内容脚本添加到 localStorage,然后当用户单击浏览器图标时,循环浏览链接并将它们显示在弹出窗口中。我是 chrome 扩展的新手,但我的理解是弹出窗口不能直接从内容脚本访问变量,因此需要本地存储。但我可能离题了。
      • 对链接的引用不能放在String 中,localStorage 将存储唯一的东西。但是弹出窗口不需要触摸链接本身,不是吗?它只需要知道链接指向的 URL (href),确定吗?这只是一个String,所以当然可以是 JSON 字符串化的。并不是说我认为您实际上根本需要localStorage。我不了解 Chrome,但大多数浏览器扩展应该可以轻松打开新窗口并使用字符串列表填充它,而无需通过任何类型的 localStorage 数据库进行调解。
      • 您可以使用背景页面作为控制器,并从那里访问存储的值。有关示例,请参阅我的新标签重定向代码(我在中继代码中使用 JSON.stringify)code.google.com/p/newtabredirect
      猜你喜欢
      • 2019-06-25
      • 1970-01-01
      • 2014-01-22
      • 2015-03-31
      • 1970-01-01
      • 2012-04-02
      • 2013-09-04
      • 2014-07-06
      • 1970-01-01
      相关资源
      最近更新 更多