2011-09-14 16 views
5

我想本地保存有循環引用的對象。我有什麼選擇?如何用循環引用保存對象?

我首先想到的是用HTML5本地存儲空間,但我不能這個對象字符串化由於循環引用。

具體我想保存當前選擇的DOMSelection對象。

例子:

var sel = window.getSelection(); 
    var selstring = JSON.stringify(sel); // Breaks here ... 
    localStorage.setItem("selection",selstring); 

我能得到的字符串化到現在的工作的唯一辦法是通過忽略某些物體,像這樣:

var selstring = JSON.stringify(sel,function(k,v){ 
    if(k=="anchorNode" || 
     k=="baseNode" || 
     k=="extentNode" || 
     k=="focusNode") return undefined; 

    return v; 
}); 

但是,這給我留下了一個相當空DOMSelection對象,對於我所需要的是不夠的。

是否有其他方法可以讓我保存此對象嗎?唯一的要求是它在移動Safari中運行,其他任何事情都是真的。該解決方案可以在JavaScript或jquery(或任何其他js庫,如果需要的話)。

感謝您提供的任何幫助。

+0

請參閱http://stackoverflow.com/questions/4001474/json-standard-way-of-referencing-an-object-by-identity-for-eg-circular-refere –

回答

3

退房Crockford's JSON-JS GitHub repo。它有一個文件cycle.js,它可以將帶有循環引用的對象轉換爲JSON並使用JSONPath進行轉換。請參閱回購的最後一段閱讀我和文件的評論。

+0

我會將此標記爲已回答,因爲它最直接地回答了我最初的問題。不幸的是,我不能測試它是否可以用於存儲DOMSelection對象,因爲事實證明,我不需要它用於這個項目,但這是一個具體的例子。 – nebs

+0

如何將cycle.js放入我的代碼中?我也有類似的問題。 – corazza

+0

通過將文件包含在腳本標記中。但請注意,這遠非最佳解決方案。你應該確保你的對象沒有循環引用,並且絕對不需要JSON編碼DOM節點。 –

3

這裏的答案在於理解哪些數據確實需要持久地存儲並儘量減少到必要的東西,然後添加一個方法或函數來獲取只是信息,然後保存該。我不知道你的應用程序,但是對於文本選擇,你可能只需要持續指示它是哪個對象以及文本選擇的開始和結束點。

然後,在恢復方面,你將建立一個函數使用你存儲數據建立一個選擇。這不是一個簡單的序列化/反序列化,但它會起作用。

+0

是的,這是我想離開作爲DOMSelection對象看起來相當複雜的最後一招。事實上,我意識到我不需要存儲DOMSelection,我發現了一個解決方案來滿足我的需求。 – nebs