我正在尝试使用asp.net和jQuery创建一个树导航器。
首先我从数据库中获取根节点,并将它们绑定到asp Repeater,如下所示,
<ul>
<asp:Repeater ID="repMail" runat="server">
<ItemTemplate>
<li class="list <%# Eval("Type") %>" id="<%# Eval("Id") %>">
<span style="margin-right: 10px" class="glyphicon <%# GetIcon(Eval("Type")) %>"></span><%# Eval("Title") %>
</li>
</ItemTemplate>
</asp:Repeater>
</ul>
然后当用户点击其中一个根节点时我正在加载孩子......它将一直运行直到没有文件夹。 Jquery如下:
$('.list.Folder').click(function (e) {
e.stopPropagation();
var self = $(this);
var s = self.find('span');
var children = self.find(' > ul > li');
var count = children.length;
//check if child nodes already append
if (count == 0) {
//changing icon folder open
if (s.hasClass('glyphicon-folder-close')) {
s.removeClass('glyphicon-folder-close');
s.addClass('glyphicon-folder-open');
var code = self.attr('id');
// get the child nodes from database using ajax get
var url = "TreeItem";
var arg = {
action: 'GetNodes',
type: 'Folder',
data: code
};
$.get(url, arg)
.done(function (r) {
var msgAll = $.parseJSON(r);
var u = $('<ul>');
for (var i = 0; i < msgAll.length; i++) {
var m = msgAll[i];
if (m.Type === 'Folder') {
u.append('<li class="list ' + m.Type + '" id="' + m.Id + '"><span style="margin-right: 10px" class="glyphicon glyphicon-folder-close"></span>' + m.Title + '</li>');
} else if (m.Type === 'List') {
u.append('<li class="list ' + m.Type + '" id="' + m.Id + '"><span style="margin-right: 10px" class="glyphicon glyphicon-leaf"></span>' + m.Title + '</li>');
}
}
u.append('</ul>');
u.appendTo(self);
})
.fail(function () {
});
}
} else {
if ((s.hasClass('glyphicon-folder-open')) && (children.is(':visible'))) {
s.removeClass('glyphicon-folder-open');
s.addClass('glyphicon-folder-close');
children.hide();
} else if ((s.hasClass('glyphicon-folder-close')) && (children.is(':hidden'))) {
s.removeClass('glyphicon-folder-close');
s.addClass('glyphicon-folder-open');
children.show();
}
}
return false;
});
在这里,从'GetIcon'方法,如果Type是文件夹,它将返回'glyphicon-folder-close',如果它只是一个节点,则返回'glyphicon-leaf'。
我的问题是,当我点击第二级文件夹li项时,它将引用父级,虽然我使用了stopPropagation()并返回false。