Javascript 即使存在循环引用,如何将DOM节点序列化为JSON?

Javascript 即使存在循环引用,如何将DOM节点序列化为JSON?,javascript,json,dom,serialization,circular-reference,Javascript,Json,Dom,Serialization,Circular Reference,我想将DOM节点甚至整个窗口序列化为JSON 例如: >> serialize(document) -> { "URL": "http://stackoverflow.com/posts/2303713", "body": { "aLink": "", "attributes": [ "getNamedItem": "function getNamedItem() { [native code

我想将DOM节点甚至整个窗口序列化为JSON

例如:

 >> serialize(document)
    -> {
      "URL": "http://stackoverflow.com/posts/2303713",
      "body": {
        "aLink": "",
        "attributes": [
          "getNamedItem": "function getNamedItem() { [native code] }",
          ...
        ],
        ...
        "ownerDocument": "#" // recursive link here
      },
      ...
    }
JSON.stringify 问题是JSON默认情况下不支持循环引用

var obj = {}
obj.me = obj
JSON.stringify(obj) // TypeError: Converting circular structure to JSON
window和DOM节点有许多这样的节点。window==window.window作为document.body.ownerDocument==文档

另外,JSON.stringify不会序列化函数,所以这不是我要找的

很好,不是吗

 dojox.json.ref.toJson(window) // Error: Can't serialize DOM nodes
对我来说还不够好

为什么?
我正在尝试为不同的浏览器创建DOM兼容性表。例如,Webkit支持占位符属性,Opera不支持,IE8支持本地存储,IE7不支持,等等

我不想做成千上万的测试用例。我想做一个通用的方法来测试它们

更新,2013年6月
我制作了一个原型。

您可以遍历DOM并生成它的纯JS对象表示,然后将其提供给DojoX序列化程序。但是,您必须首先决定如何计划将DOM元素、它们的属性和文本节点无歧义地映射到JS对象。例如,您将如何表示以下内容

<parent attr1="val1">
  Some text
  <child attr2="val2"><grandchild/></child>
</parent>

我认为DojoX不立即支持DOM序列化的原因可能正是:首先需要选择一个方案来将DOM映射到JS对象。是否有可以采用的标准方案?您的JS对象会仅仅模拟一个没有任何函数的DOM树吗?我认为您必须首先定义从序列化DOM到JSON的期望值。

看起来您必须自己编写它。JSON序列化数据也可能不是任务DOM兼容性表的理想选择。您可能需要自己迭代对象,检查属性的类型等等

var functions = [];
var strings = [];
for( var key in window ) {
    if( typeof window[key] == 'string' ) {
        strings[strings.length] = key;
    } else if( typeof window[key] == 'function' ) {
        functions[functions.length] = key;
    } else if( ... ) { ... }
}
...
当我尝试将XML字符串转换为JSON时,我发现它非常有用

XMLObjectifier.xmlToJSON(XMLObjectifier.textToXML(xmlString));
也许会有帮助。

尝试一下将XHTML DOM元素转换为JSON的语法。例如:

<ul>
    <li style="color:red">First Item</li>
    <li title="Some hover text." style="color:green">Second Item</li>
    <li><span class="code-example-third">Third</span> Item</li>
</ul>

我还没有用过它,但我想在一个项目中使用它,在这个项目中,我想使用mustache.js重新创建网页模板。

我正在尝试为不同的浏览器创建DOM兼容性表。您希望如何序列化DOM节点?您希望从DOM节点获得什么信息?Gumbo,我刚刚添加了一个示例。现在清楚了吗?FWIW,我仍然不明白序列化为JSON如何帮助您测试兼容性的通用方法。我需要区分不同浏览器的整个窗口对象。如果不将窗口序列化为JSON之类的东西,我不知道该怎么做。我已经在控制台中做了类似的事情。_source_of,但它不处理循环引用。看起来我需要从dojox.json.ref中获取算法并根据需要采用它。为了快速搜索xmlobjectifier jquery,脚本被移动到SourceForge a。然而,我发现它有点过时了。
var functions = [];
var strings = [];
for( var key in window ) {
    if( typeof window[key] == 'string' ) {
        strings[strings.length] = key;
    } else if( typeof window[key] == 'function' ) {
        functions[functions.length] = key;
    } else if( ... ) { ... }
}
...
XMLObjectifier.xmlToJSON(XMLObjectifier.textToXML(xmlString));
<ul>
    <li style="color:red">First Item</li>
    <li title="Some hover text." style="color:green">Second Item</li>
    <li><span class="code-example-third">Third</span> Item</li>
</ul>
["ul",
    ["li", {"style": "color:red"}, "First Item"],
    ["li", {"title": "Some hover text.", "style": "color:green"}, "Second Item"],
    ["li", ["span", {"class": "code-example-third"}, "Third"], " Item" ]
]