3

刚刚了解了 jquery 的 .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 '[]'

关于我做错了什么的任何想法?

4

2 回答 2

3

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);
于 2010-07-27T23:48:12.273 回答
0

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

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

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

如果你想记住链接指向的地方,你应该从它们的href属性中得到它,作为一个String简单的值类型,可以安全地被localStorage.

于 2010-07-27T23:48:26.373 回答