如何使用循环引用保存对象?

时间:2011-09-14 17:40:15

标签: javascript json serialization storage circular-reference

我想在本地保存一个具有循环引用的对象。我有什么选择?

我的第一个想法是使用HTML5本地存储,但由于循环引用,我无法对此对象进行字符串化。

具体来说,我正在尝试保存当前选择的DOMSelection对象。

示例:

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

我现在可以让stringify工作的唯一方法就是忽略某些对象:

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

    return v;
});

但这给我留下了一个相当空的DOMSelection对象,这对我所需要的还不够。

还有其他方法可以保存这个对象吗?唯一的要求是它在移动游猎中运行,其他任何东西都是真的。解决方案可以是javascript或jquery(或任何其他js lib,如果需要)。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:3)

这里的答案在于了解您确实需要持久存储哪些数据并将其最小化到仅需要的数据,然后添加方法或函数以获取该信息然后保存。我不知道您的应用程序,但是对于文本选择,您可能只需要持久指示它是哪个对象以及文本选择的起点和终点。

然后,在还原方面,您将构建一个函数来使用您存储的数据构建选择。序列化/反序列化不是那么简单,但它会起作用。

答案 1 :(得分:3)

结帐Crockford's JSON-JS GitHub repo。它有一个文件cycle.js,它可以转换为使用JSON循环引用的对象,然后使用JSONPath返回。请参阅回购中的最后一段读我和文件的评论。