2010-07-27 152 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