Как сериализировать узел DOM к JSON, даже если существуют циклические ссылки?

Я хочу сериализировать узел DOM или даже целый window к 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

window и узлы DOM имеют многих из них. 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 не делает, поддержки IE 8 localStorage и IE 7 не делает и так далее.

Я не хочу делать тысячи тестовых сценариев. Я хочу освободить дорогу для, тестируют их всех.

Обновление, июнь 2013

Я сделал прототип NV/dom-dom-dom.com.

48
задан Ciro Santilli 新疆改造中心法轮功六四事件 31 May 2016 в 08:49
поделиться

2 ответа

Похоже, вам придется написать это самостоятельно. Сериализованные данные 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( ... ) { ... }
}
...
3
ответ дан 26 November 2019 в 19:06
поделиться

Вы потенциально можете пройти через 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».

5
ответ дан 26 November 2019 в 19:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: