Ответ 1
Я только что написал эту функцию, которая делает то, что вы хотите, попробуйте, дайте мне знать, если она не работает правильно для вас:
// Test with an element.
var initElement = document.getElementsByTagName("html")[0];
var json = mapDOM(initElement, true);
console.log(json);
// Test with a string.
initElement = "<div><span>text</span>Text2</div>";
json = mapDOM(initElement, true);
console.log(json);
function mapDOM(element, json) {
var treeObject = {};
// If string convert to document Node
if (typeof element === "string") {
if (window.DOMParser) {
parser = new DOMParser();
docNode = parser.parseFromString(element,"text/xml");
} else { // Microsoft strikes again
docNode = new ActiveXObject("Microsoft.XMLDOM");
docNode.async = false;
docNode.loadXML(element);
}
element = docNode.firstChild;
}
//Recursively loop through DOM elements and assign properties to object
function treeHTML(element, object) {
object["type"] = element.nodeName;
var nodeList = element.childNodes;
if (nodeList != null) {
if (nodeList.length) {
object["content"] = [];
for (var i = 0; i < nodeList.length; i++) {
if (nodeList[i].nodeType == 3) {
object["content"].push(nodeList[i].nodeValue);
} else {
object["content"].push({});
treeHTML(nodeList[i], object["content"][object["content"].length -1]);
}
}
}
}
if (element.attributes != null) {
if (element.attributes.length) {
object["attributes"] = {};
for (var i = 0; i < element.attributes.length; i++) {
object["attributes"][element.attributes[i].nodeName] = element.attributes[i].nodeValue;
}
}
}
}
treeHTML(element, treeObject);
return (json) ? JSON.stringify(treeObject) : treeObject;
}
Рабочий пример: http://jsfiddle.net/JUSsf/ (Протестировано в Chrome, я не могу гарантировать полную поддержку браузера - вам придется протестировать это).
Он создает объект, который содержит древовидную структуру HTML-страницы в запрошенном вами формате, а затем использует JSON.stringify()
, который включен в большинство современных браузеров (IE8 +, Firefox 3+.etc); Если вам нужно поддерживать старые браузеры, вы можете включить json2.js.
В качестве аргумента может использоваться либо DOM element
, либо string
, содержащий действительный XHTML (я уверен, я не уверен, будет ли DOMParser()
захлебываться в определенных ситуациях, поскольку он установлен на "text/xml"
или независимо от того, просто ли он не обеспечивает обработку ошибок. К сожалению, "text/html"
имеет плохую поддержку браузера).
Вы можете легко изменить диапазон этой функции, передав другое значение как element
. Независимо от того, какое значение вы передадите, будет являться корнем вашей карты JSON.
Enjoy