Давайте не будем использовать взлом строк HTML, не так ли? Это сломалось бы, как только у любого из данных были символы как <
или &
in (или "
в значениях атрибута). Используйте методы DOM, и вам не нужно беспокоиться о экранировании символов:
function createNav(navs) {
var ul= document.createElement('ul');
for (name in navs) {
var nav= navs[name];
var a= document.createElement('a');
a.href= nav.url;
a.appendChild(document.createTextNode(nav.label));
var li= document.createElement('li');
li.id= 'nav-'+name;
li.appendChild(a)
if ('subnav' in nav)
li.appendChild(createNav(nav.subnav));
ul.appendChild(li);
}
return ul;
}
document.getElementById('navcontainer').appendChild(createNav(jsondata));
Большинство сред JS предлагают ярлыки, чтобы сделать это немного менее объемным. Например, с помощью jQuery:
function createNav(navs) {
var ul= $('<ul>');
for (name in navs) {
var nav= navs[name];
var li= $('<li>', {id: name});
li.append($('<a>', {href: nav.url, text: nav.label}));
if ('subnav' in nav)
li.append(createNav(nav.subnav));
ul.append(li);
}
}
$('#navcontainer').append(createNav(jsondata));
Обратите внимание, что в любом случае вы используете литерал объекта, что означает, что вы не можете контролировать порядок вывода списка навигаций. У вас нет гарантии, что main
будет выше project
. Если вам нужен определенный порядок, вам нужно будет, чтобы возвращаемые данные JSON были массивом.