【问题标题】:How to save an object with circular references?如何使用循环引用保存对象?
【发布时间】:2011-11-17 05:57:33
【问题描述】:

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

我的第一个想法是使用 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 对象,这不足以满足我的需要。

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

感谢您提供的任何帮助。

【问题讨论】:

标签: javascript json serialization storage circular-reference


【解决方案1】:

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

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

【讨论】:

  • 是的,这就是我想要留下的最后手段,因为 DOMSelection 对象看起来相当复杂。事实上,我意识到我根本不需要存储 DOMSelection,并且我找到了满足我需求的解决方法。
【解决方案2】:

查看Crockford's JSON-JS GitHub repo。它有一个文件cycle.js,据说可以将具有循环引用的对象转换为JSON,然后使用JSONPath 转换回来。请参阅 repo 的 read me 和文件的 cmets 中的最后一段。

【讨论】:

  • 我会将其标记为已回答,因为它最直接地回答了我最初的问题。不幸的是,我无法测试它是否适用于存储 DOMSelection 对象,因为事实证明我不需要它用于这个项目,但无论如何这是一个具体的例子。
  • 如何将cycle.js 放入我的代码中?我也有类似的问题。
  • 通过将文件包含在脚本标签中。但是请注意,这远非最佳解决方案。相反,您应该确保您的对象没有循环引用,并且除非绝对需要,否则永远不要对 DOM 节点进行 JSON 编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2011-05-15
  • 1970-01-01
  • 2015-12-24
相关资源
最近更新 更多