我试图从Javascript中的UL元素构建JSON对象。将无序列表转换为JSON
我有这样的表结构:
<ul id="trainingmenu">
<li class="tmnode"><span id="M5lx9n" class="tmname">menu 1</span>
<ul>
<li class="tmnode"><span id="M66p48" class="tmname">menu 2</span>
<ul>
<li class="tmnode"><span class="tmname" id="Mschr">menu 3</span>
</li>
</ul>
</li>
<li class="tmnode"><span id="Mu03e0" class="tmname">menu 4</span></li>
</ul>
</li>
</ul>
这是JS:
var treeObject = {};
function treeHTML(element, object) {
if (element.tagName=="UL") { element=element.firstChild; }
object["id"] = element.firstChild.id;
object["name"] = element.firstChild.innerHTML;
var nodeList = element.getElementsByTagName('LI');
if (nodeList[0]) {
object["nodes"] = [];
for (var i = 0; i < nodeList.length; i++) {
object["nodes"].push({});
treeHTML(nodeList[i], object["nodes"][object["nodes"].length - 1]);
}
}
}
treeHTML(document.getElementById("trainingmenu"), treeObject);
alert(JSON.stringify(treeObject));
..和这是我得到的输出:
{"id":"M5lx9n","name":"menu 1","nodes":[{"id":"M66p48","name":"menu 2","nodes":[{"id":"Mschr","name":"menu 3"}]},{"id":"Mschr","name":"menu 3"},{"id":"Mu03e0","name":"menu 4"}]}
这部分这是我想要的格式 - 从每个LI元素的childNode中挑选id和name字段。但它是重复的节点 - 菜单3出现了两次
这里有一个fiddle
我可能搞砸了递归,但它已经盯着2天都没有制定出如何。谁能帮忙?
FWIW,我微微一愣的代码在所有工作。如果HTML代码确实如此写入,则外部'ul'上的'element.firstChild' _should_返回'ul'和'li'之间的空白文本节点。在较新的浏览器中,您可以使用'.firstElementChild'来忽略文本节点。 – Alnitak
正确 - 这只是为了便于阅读;我删除了小提琴的中断。但是,我不知道.firstElementChild(!),所以我在那里学到了一些东西。感谢那。 – WindsorAndy
@WindsorAndy不要忘记'firstElementChild'是DOM规范中的一个适度增加 - 它可能不存在于旧版浏览器中。 – Alnitak