MY jSon数据Strucutre:
var data = {
"FolderList": [
{
"FolderID": 1,
"FolderName": "parent1",
"ParentFolderID": -1
},
{
"FolderID": 2,
"FolderName": "parent1 Child1",
"ParentFolderID": 1
},
{
"FolderID": 3,
"FolderName": "parent2",
"ParentFolderID": -1
},
{
"FolderID": 4,
"FolderName": "parent1 Child1 Child1",
"ParentFolderID": 2
},
{
"FolderID": 5,
"FolderName": "parent1 Child1 Child2",
"ParentFolderID": 2
},
{
"FolderID": 6,
"FolderName": "parent2 Child1",
"ParentFolderID": 3
}
]
};
现在,我想像这样创建文件夹层次结构html:
parent1
parent1 child1
parent1 child1 child1
parent1 child1 child2
parent2
parent2 child1
实际上我想生成像这样的HTML代码
<ul> <li>Parent1 <ul> <li>parent1 child1 <ul> <li>parent1 child1 child1</li> <li>parent1 child1 child2</li> </ul> </li> </ul> </li> <li>parent2 <ul> <li>parent2 child1</li> </ul> </li> </ul>
如何使用JavaScript或jQuery执行此操作?提前致谢。我试图使用递归函数,但被卡在中间。但是我的代码是这样的:
function populatedata() {
$.each(data.FolderList, function (i, folder) {
if (folder.ParentFolderID == -1) {
html += '<li>' + folder.FolderName;
checkChild(folder.FolderID);
html += '</li>';
}
});
}
function checkChild(parentid) {
$.each(data.FolderList, function (i, folder) {
if (folder.ParentFolderID == parentid) {
html += '<li><ul>' + folder.FolderName;
checkChild(folder.FolderID);
html+=</ul></li>
return html;
}
else {
return ;
}
});
}
最后在FAngel的帮助下使用下面的代码,我在项目中创建了实际需要的结构
我修改过的代码是这样的:
function populatedata() { var list = $("<ul>").attr({ class: "collapsibleList", id: "folder" }); $.each(data.FolderList, function (i, folder) { if (folder.ParentFolderID == -1) { var item = $("<li>"). css("border-top","0").html('<span>'+folder.FolderName +'</span><a href="Docs.html"> <div class="view-docs pull-right">View</div></a>'); list.append(item); var children = $('<ul>'); item.append(children); checkChild(folder.FolderID, children); } }); $('#folderList').append(list); } function checkChild(parentid, parent) { $.each(data.FolderList, function (i, folder) { if (folder.ParentFolderID == parentid) { var item = $("<li>"). html('<span>'+folder.FolderName +'</span><a href="Docs.html"> <div class="view-docs pull-right">View</div></a>'); var children = $('<ul>'); parent.append(item); item.append(children); checkChild(folder.FolderID, children); } else { return; } }); }
答案 0 :(得分:4)
以下是演示:http://jsfiddle.net/zn2C7/7/
var list = $("<ul>");
function populatedata() {
$.each(data.FolderList, function (i, folder) {
if (folder.ParentFolderID == -1) {
var item = $("<li>").html(folder.FolderName);
list.append(item);
var children = $('<ul>');
item.append(children);
checkChild(folder.FolderID, children);
}
});
$('body').append(list);
}
function checkChild(parentid, parent) {
$.each(data.FolderList, function (i, folder) {
if (folder.ParentFolderID == parentid) {
var item = $("<li>").html(folder.FolderName);
var children = $('<ul>');
parent.append(item);
item.append(children);
checkChild(folder.FolderID, children);
}
else {
return ;
}
});
}
可以使用html变量构建它,就像你试图这样做一样,但是使用jQuery($('<ul>')
和$('<li>')
的DOM操作函数要简单得多 - 创建新元素,{ {3}} - 将元素附加到其他元素上)
function checkChild(parentid) {
$.each(data.FolderList, function (i, folder) {
if (folder.ParentFolderID == parentid) {
html += '<li><ul>' + folder.FolderName;
checkChild(folder.FolderID);
html+=</ul></li>
return html;
}
else {
return ;
}
});
}
此外,请注意,在上面的代码中,您正在return html;
函数回调each
。不确定你想要得到什么,但在.append()
中,它可能像常规循环中的break
一样工作(如果你将返回false):
我们可以通过返回来停止回调函数中的循环 假的。
那是来自jquery api页面。
此外,对于此类任务,我更喜欢使用调试器。目前,在浏览器中有很多强大的HTML / CSS / JS调试工具。只需在Chrome,IE或FF中按 F12 (对于最后一个,您可能需要安装Firebug扩展),您将获得许多有用的功能以及简单的JS调试。
答案 1 :(得分:2)
我已更新代码并按以下方式解决。如果代码没有任何li元素,代码将不会创建不必要的ul元素。如果父母没有孩子,则没有ul。
function populateFolder() {
var list = $("<ul>").attr({ class: "collapsibleList", id: "folder" });
$.each(data.FolderList, function (i, folder) {
if (folder.ParentFolderID == -1) {
var item = $("<li>").html('<span>' + folder.FolderName +
'</span><a href="Docs.html">
<div class="view-docs pull-right">View</div></a>');
checkChild(folder.FolderID, item);
list.append(item);
});
$('#anydiv').append(list);
}
function checkChild(parentid, parent) {
$.each(data.FolderList, function (i, folder) {
if (folder.ParentFolderID == parentid) {
var children = $('<ul>');
var item = $("<li>").html('<span>' + folder.FolderName
+ '</span><a href="Docs.html">
<div class="view-docs pull-right">View</div></a></li>');
children.append(item);
checkChild(folder.FolderID, item);
parent.append(children);
}
else
return;
});
}