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"}]}
그것은 일부
나는이 목록의 구조 -working 그리고 이것은 내가 원하는 형식이다 - 각 LI 요소의 childNode에서 id와 name 필드를 고른다. 그러나 노드를 반복입니다 - 메뉴 3은 여기에 두 번
을 표시 아마 재귀를 망쳐했지만 2 일 동안 그것을 응시 한 fiddle
A는 방법을 근무 한 적이없는입니다. 누구든지 도와 줄 수 있습니까?
FWIW, 나는 약간 코드가 전혀 작동 놀라게 해요 :
여기에 또한 IE의 이전 버전에서 작동합니다 대안 솔루션입니다. HTML 코드가 실제로 쓰여졌을 경우 바깥 쪽'ul'에서'element.firstChild'는'ul'과'li' 사이의 공백 텍스트 노드를 반환해야합니다. 새로운 브라우저에서는'.FirstElementChild'를 사용하여 텍스트 노드를 무시합니다. – Alnitak
참 - 이는 읽기 쉽도록하기위한 것입니다. 나는 바이올린에서 휴식을 제거했습니다. 그러나, 나는 .firstElementChild (!)에 대해 몰랐다. 그래서 나는 거기에서 뭔가를 배웠다. 고마워. – WindsorAndy
@WindsorAndy는 'firstElementChild'가 DOM 사양에 적당히 추가되었음을 잊지 않습니다. 이전 버전의 브라우저에는 존재하지 않을 수도 있습니다. – Alnitak