50

windowDOMノードまたは全体をJSONにシリアル化したい。

例えば:

 >> serialize(document)
    -> {
      "URL": "http://stackoverflow.com/posts/2303713",
      "body": {
        "aLink": "",
        "attributes": [
          "getNamedItem": "function getNamedItem() { [native code] }",
          ...
        ],
        ...
        "ownerDocument": "#" // recursive link here
      },
      ...
    }

JSON.stringify()

JSON.stringify(window) // TypeError: Converting circular structure to JSON

問題は、JSONがデフォルトで循環参照をサポートしていないことです。

var obj = {}
obj.me = obj
JSON.stringify(obj) // TypeError: Converting circular structure to JSON

windowDOMノードにはそれらの多くがあります。window === window.windowのようにdocument.body.ownerDocument === document

また、JSON.stringify関数をシリアル化しないので、これは私が探しているものではありません。

dojox.json.ref

 `dojox.json.ref.toJson()` can easily serialize object with circular references:

    var obj = {}
    obj.me = obj
    dojox.json.ref.toJson(obj); // {"me":{"$ref":"#"}}

いいですね。

 dojox.json.ref.toJson(window) // Error: Can't serialize DOM nodes

私には十分ではありません。

なんで?

さまざまなブラウザ用のDOM互換性テーブルを作成しようとしています。たとえば、Webkitはプレースホルダー属性をサポートし、Operaはサポートしません。IE8はサポートし、IE7はサポートlocalStorageしません。

何千ものテストケースを作りたくありません。それらすべてをテストするための一般的な方法を作りたいと思います。

更新、2013年6月

プロトタイプのNV/dom-dom-dom.comを作成しました。

4

4 に答える 4

15

http://jsonml.org/は、XHTMLDOM要素を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>

になります

["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" ]
]

まだ使用していませんが、任意のWebページを取得し、mustache.jsを使用して再テンプレート化するプロジェクトで使用することを検討しています。

于 2011-03-13T03:56:16.643 に答える
5

DOMをトラバースして、そのDOMの純粋なJSオブジェクト表現を生成し、それをDojoXシリアライザーにフィードする可能性があります。ただし、最初に、DOM要素、それらの属性、およびテキストノードをあいまいさなしにJSオブジェクトにマップする方法を決定する必要があります。たとえば、次のことをどのように表現しますか?

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

このような?

{
    tag: "parent",
    attributes: [
        {
            name: "attr1",
            value: "val1"
        }
    ],
    children: [
        "Some text",
        {
            tag: "child",
            attributes: [
                {
                    name: "attr2",
                    value: "val2"
                }
            ],
            children: [
                { tag: "grandchild" }
            ]
         }
     ]
 }

DojoXがDOMシリアル化をすぐにサポートしない理由は、まさにこれである可能性があると思います。最初にDOMをJSオブジェクトにマッピングするためのスキームを選択する必要があります。採用できる標準的なスキームはありますか?JSオブジェクトは、関数なしでDOMツリーを模倣するだけですか?まず、「DOMをJSONにシリアル化する」ことから何を期待するかを定義する必要があると思います。

于 2010-02-20T21:26:31.323 に答える
5

XML文字列をJSONに変換しようとしていたときに、これがうまく機能しました

XMLObjectifier.xmlToJSON(XMLObjectifier.textToXML(xmlString));

多分それは助けになるでしょう。

于 2010-10-20T23:47:35.783 に答える
3

自分で書かなければならないようです。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( ... ) { ... }
}
...
于 2010-02-20T21:32:50.020 に答える