jQuery递归逻辑树
jQuery Recursive logic tree
我的问题是,我们如何让下面的逻辑在jQuery中起作用。我从 HTML 页面上的这个片段开始:
<ul>
<li><a href="#">Parent</a></li>
</ul>
功能:
所以当我点击 link 时,我想检查
是否有 child class。如果是,则将 <li><a href="#">Child</a></li>
附加到 child <ul
元素,在 <a>
标记之后。但是,如果没有找到 child <ul>
,它必须首先创建一个 <ul>
标签,然后将 <li><a href="#">Child</a></li>
添加到新创建的 <ul>
标签。
所以点击上面的例子应该得到这个:
<ul>
<li><a href="#">Parent</a>
<ul>
<li><a href="#">Child</a></li>
</ul>
</li>
</ul>
再次点击 Parent 标签会出现:
<ul>
<li><a href="#">Parent</a>
<ul>
<li><a href="#">Child</a></li>
<li><a href="#">Child</a></li>
</ul>
</li>
</ul>
另外:
我的麻烦是我希望这递归地发生。意思是,单击 "Child" 文本将检查 child <li>
class 是否有子 <ul>
并向其添加 <li>
..如果不是,先加<ul>
,再加<li>
。这应该持续到永远。
这是我尝试过的 — http://jsfiddle.net/arsalanbashir/et79cuj5/
EDIT — 刚注意到,我的代码根本不起作用。不知道为什么。这就是我所做的:
$('#intro').click(function(){
if($($('#list').length)){
$('#list').append("<li><a>SOMETHING</a></li>");
} else{
$('.node').append("<ul id='#list'><li><a>SOMETHING</a></li></ul>");
}
});
这是 HTML:
<ul>
<li class="node">
<a id="intro" href="#">Introduction</a>
</li>
</ul>
编辑 2 让我澄清一下我在寻找什么 —
一个列表,向每个被单击的元素添加 child。
$('#intro').click(function(){
console.log('clicking');
if($('#list').length){
$('#list').append("<li><a>SOMETHING</a></li>");
}else{
$('.node').append("<ul id='#list'><li><a>SOMETHING</a></li></>");
}
});
您可以在 jQuery 中使用 .children()
检查。这将以递归方式工作,因为它会相对地检查 children。
$('li').click(function () {
// Check if an inner list exists
if ($(this).children('ul').length) {
$(this).children('ul').first().append(child)
}
else {
$(this).append(newList)
}
});
见 fiddle http://jsfiddle.net/et79cuj5/33/
$('#intro').on('click', function () {
var hasNestedList = $(this).parents('li').has('ul');
var parentItem = $(this).parents('li');
var newChildItem = '<li><a href="#">Child</a></li>';
var newChildList = '<ul></ul>'
var insertionPoint = parentItem
if (hasNestedList.size() === 0) {
parentItem.append(newChildList);
}
insertionPoint = $(this).parents('li').find('ul');
insertionPoint.append(newChildItem)
});
这很好用。
var add_child = function (element) {
if($(element).parent().find("ul").html()){
$(element).parent().find("ul").first().append("<li><a href='#'>Child</a></li>");
} else{
$(element).parent().append("<ul><li><a href='#'>Child</a></li><ul>");
}
}
$(document).on('click', 'a', function(){
add_child(this);
});
我的问题是,我们如何让下面的逻辑在jQuery中起作用。我从 HTML 页面上的这个片段开始:
<ul>
<li><a href="#">Parent</a></li>
</ul>
功能:
所以当我点击 link 时,我想检查
<li><a href="#">Child</a></li>
附加到 child <ul
元素,在 <a>
标记之后。但是,如果没有找到 child <ul>
,它必须首先创建一个 <ul>
标签,然后将 <li><a href="#">Child</a></li>
添加到新创建的 <ul>
标签。
所以点击上面的例子应该得到这个:
<ul>
<li><a href="#">Parent</a>
<ul>
<li><a href="#">Child</a></li>
</ul>
</li>
</ul>
再次点击 Parent 标签会出现:
<ul>
<li><a href="#">Parent</a>
<ul>
<li><a href="#">Child</a></li>
<li><a href="#">Child</a></li>
</ul>
</li>
</ul>
另外:
我的麻烦是我希望这递归地发生。意思是,单击 "Child" 文本将检查 child <li>
class 是否有子 <ul>
并向其添加 <li>
..如果不是,先加<ul>
,再加<li>
。这应该持续到永远。
这是我尝试过的 — http://jsfiddle.net/arsalanbashir/et79cuj5/
EDIT — 刚注意到,我的代码根本不起作用。不知道为什么。这就是我所做的:
$('#intro').click(function(){
if($($('#list').length)){
$('#list').append("<li><a>SOMETHING</a></li>");
} else{
$('.node').append("<ul id='#list'><li><a>SOMETHING</a></li></ul>");
}
});
这是 HTML:
<ul>
<li class="node">
<a id="intro" href="#">Introduction</a>
</li>
</ul>
编辑 2 让我澄清一下我在寻找什么 —
一个列表,向每个被单击的元素添加 child。
$('#intro').click(function(){
console.log('clicking');
if($('#list').length){
$('#list').append("<li><a>SOMETHING</a></li>");
}else{
$('.node').append("<ul id='#list'><li><a>SOMETHING</a></li></>");
}
});
您可以在 jQuery 中使用 .children()
检查。这将以递归方式工作,因为它会相对地检查 children。
$('li').click(function () {
// Check if an inner list exists
if ($(this).children('ul').length) {
$(this).children('ul').first().append(child)
}
else {
$(this).append(newList)
}
});
见 fiddle http://jsfiddle.net/et79cuj5/33/
$('#intro').on('click', function () {
var hasNestedList = $(this).parents('li').has('ul');
var parentItem = $(this).parents('li');
var newChildItem = '<li><a href="#">Child</a></li>';
var newChildList = '<ul></ul>'
var insertionPoint = parentItem
if (hasNestedList.size() === 0) {
parentItem.append(newChildList);
}
insertionPoint = $(this).parents('li').find('ul');
insertionPoint.append(newChildItem)
});
这很好用。
var add_child = function (element) {
if($(element).parent().find("ul").html()){
$(element).parent().find("ul").first().append("<li><a href='#'>Child</a></li>");
} else{
$(element).parent().append("<ul><li><a href='#'>Child</a></li><ul>");
}
}
$(document).on('click', 'a', function(){
add_child(this);
});