Я хочу сериализировать узел 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(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.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 не делает и так далее.
Я не хочу делать тысячи тестовых сценариев. Я хочу освободить дорогу для, тестируют их всех.
Я сделал прототип NV/dom-dom-dom.com.
Похоже, вам придется написать это самостоятельно. Сериализованные данные 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( ... ) { ... }
}
...
Вы потенциально можете пройти через 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».