确定嵌套 HTML 列表中的相邻 <li>
Determine adjacent <li> inside a nested HTML list
>我有一个嵌套列表。该列表中的一个元素包含一个名为"special"的类。此特定节点可以存在于嵌套列表中的任何位置。例如,
<ul id="mylist">
<li>1</li>
<li>2</li>
<li>
<ul>
<li>3</li>
<li class="special">4</li>
<li>
<ul>
<li>5</li>
</ul>
</li>
</ul>
</li>
<li>6</li>
</ul>
当我单击一个按钮时,我需要将两个类,说"向上"和"向下"应用于特殊节点上方和下方的节点。因此,在上述示例中,结果列表应如下所示:
<ul id="mylist">
<li>1</li>
<li>2</li>
<li>
<ul>
<li class="up">3</li>
<li class="special">4</li>
<li>
<ul>
<li class="down">5</li>
</ul>
</li>
</ul>
</li>
<li>6</li>
</ul>
如您所见,由于我的列表是一个嵌套列表,并且特殊的<li>
节点可以存在于任何位置,因此"向上"和"向下"<li>
可能也需要放置在其他<ul>
中。
我的想法
我最初的想法是做 DOM 遍历,但很快就变得非常复杂。
接下来我想我会在我的列表中创建一个包含所有
<li>
的数组($("#mylist").find ("li")
),然后找出这些<li>
中哪些具有"特殊"类(hasClass("special")
),一旦我知道"特殊"发生的数组索引,我将做 +1、-1 来获取下层和上层节点。但我不知道该怎么做。
您可以使用
.index()
来确定哪个li
具有.special
。从那里,您可以使用您的想法#2:
var lis = $("#mylist").find ("li");
lis.eq(lis.index('.special')-1).addClass('up');
lis.eq(lis.index('.special')+1).addClass('down');
考虑到相邻在您的情况下具有特殊含义,我编写了一个考虑到该特殊定义的小插件。这能准确代表您要查找的内容吗?
$.fn.adjacent = function(options) {
var df = $.extend({dir: 'up'}, options);
return this.each(function() {
var elem = df.dir === 'up' ? $(this).prev() : $(this).next();
while( $('li', elem).length ) {
elem = df.dir === 'up' ? $('li', elem).last() : $('li', elem).first();
}
elem.addClass(df.dir);
});
};
$('button').on('click', function() {
$('#mylist li.special')
.adjacent()
.adjacent({dir:'down'});
});
.up {
border-bottom: 1px solid black;
}
.down {
border-top: 1px solid black;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul id="mylist">
<li>1</li>
<li>2</li>
<li>
<ul>
<li>3</li>
<li>
<ul>
<li>3.1</li>
<li>3.2</li>
<li>3.3</li>
</ul>
</li>
<li class="special">4</li>
<li>
<ul>
<li>
<ul>
<li>4.1</li>
</ul>
</li>
<li>5</li>
</ul>
</li>
</ul>
</li>
<li>6</li>
</ul>
<button>Click</button>
你真正要问的是"如何在有序树图中获取包含前面和后面数字的节点?您只是在 HTML DOM 中分别将<ul>
和<li>
标签用作非终端节点和终端节点。解决方案是适当的树遍历。
function isBranch (node) {
return node.is('ul');
}
function isList (node) {
return node.is('li');
}
function getPrevious (node) {
while (node.length && !node.previous().length) {
node = node.parent();
}
while (isBranch(node) && !isLeaf(node)) {
node = node.children().last();
}
return isLeaf(node) ? node : $();
}
function getNext (node) {
while (node.length && !node.next().length) {
node = node.parent();
}
while (isBranch(node) && !isLeaf(node)) {
node = node.children().first();
}
return isLeaf(node) ? node : $();
}
function markPreviousAndNext (node) {
getPrevious(node).addClass('up');
getNext(node).addClass('down');
}
markPreviousAndNext($('#mylist .special'));
请花点时间,尝试更好地构建您的问题(及其标题),以便答案可以帮助未来的搜索者。我真的无法在短时间内想出一个真正合适的标题。
相关文章:
- 用嵌套函数和默认函数定义函数
- 如何在ReactJS JSX中执行嵌套的if-else语句
- Javascript 从嵌套的 UL LI 复选框生成递归 JSON 对象
- .slideup()删除整个ul,而不仅仅是嵌套的li
- 如何使用javascript/jquery动态生成这种嵌套的li对象
- 如何获得一键式嵌套的li元素
- 使用文本输入筛选 LI - 嵌套 LI 不显示
- 将数组对象转换为嵌套的 ul li 元素
- 从嵌套的 LI 中选择自定义属性
- jQuery,仅当嵌套LI的父级没有其他子级时删除该父级
- 如何添加嵌套的ul和li
- 如何在嵌套列表中获取父元素li的值
- 在jquery中无法将click事件绑定到嵌套的li
- 样式化嵌套的li元素
- 如何创建嵌套的li-ul-li元素
- 通过 jQuery 在嵌套的 ul 中添加 li
- 定义我的导航的JSON有标题类型和类别类型;d希望转换为Javascript中的嵌套UL LI元素
- Jquery嵌套在选项卡式内容UL LI列表中的LI元素
- 使用jquery显示嵌套ul-li的一级子级
- j点击查询功能到li和嵌套li