2010-07-27 68 views
2

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

这工作:

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 '[]' 

什么我做错了任何想法?

回答

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); 
0

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

元素是由它们的身份和存在于文档中定义的DOM节点。它们不是JSON可以表示的简单值。如果你看看JSON.stringify()为他们返回什么,它只是{}:JSON说,它所知道的对象是它是一个Object

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

如果你想记住的链接指向的,你应该从它们的href特性,能够安全通过localStorage记住一个String -a简单的值类型。

+0

也许我在吠叫错误的树,但这是为了扩展铬。我的想法是通过内容脚本将数组添加到localStorage中,然后当用户单击浏览器图标时,循环访问链接并在弹出窗口中显示它们。我对铬扩展是新手,但我的理解是弹出窗口不能直接访问内容脚本中的变量,因此需要本地存储。但是我可能会离开这个标记。 – plntxt 2010-07-27 23:57:39

+0

对链接的引用不能放在'String'中,'localStorage'唯一会存储。但弹出窗口不需要触摸链接本身,是吗?它只需要知道链接指向的URL('href'),当然?这只是一个'String',所以当然可以被JSON字符串化。不是我认为你实际上需要'localStorage'。我不知道Chrome,但大多数浏览器扩展应该没有问题打开一个新窗口并填充字符串列表,而无需通过任何'localStorage'数据库进行调解。 – bobince 2010-07-28 00:17:27

+1

您可以使用背景页作为控制器,并从那里访问存储的值。查看我的新标签重定向代码示例(我在中继代码中使用JSON.stringify)http://code.google.com/p/newtabredirect/ – 2010-07-28 00:17:36

相关问题