[英]Select list item parent without children in nested lists in jQuery
我有这个嵌套列表:
<ul>
<li>Item 1
<ul>
<li>Item 1A</li>
<li>Item 1B</li>
<li>Item 1C</li>
</ul>
</li>
<li>Item 2
<ul>
<li>Item 2A</li>
<li class="active">Item 2B</li>
<li>Item 2C</li>
</ul>
</li>
<li>Item 3
<ul>
<li>Item 3A</li>
<li>Item 3B</li>
<li>Item 3C</li>
</ul>
</li>
</ul>
我需要的是:当我将鼠标悬停在具有class="active"
的列表项上时,此特定项'Item 2B'及其父项'Item 2'将被涂成红色。 “项目2A”和“项目2C” 不应该是彩色的。
我尝试过closest()
:
$("li").on("mouseenter", function () {
if ($(this).hasClass("active")) {
$(this).css("color", "red");
$(this).closest("ul").closest("li").css("color", "red");
}
});
也是parent().parent()
:
$(this).parent().parent().css("color", "red");
但是他们当然都为整个“第2项”列表项着色,包括所有子项2A,2B和2C
您必须将每个父元素包装到div或span之类的html元素中。
HTML
<ul>
<li>Item 1
<ul>
<li>Item 1A</li>
<li>Item 1B</li>
<li>Item 1C</li>
</ul>
</li>
<li><span>Item 2</span>
<ul>
<li>Item 2A</li>
<li class="active">Item 2B</li>
<li>Item 2C</li>
</ul>
</li>
<li>Item 3
<ul>
<li>Item 3A</li>
<li>Item 3B</li>
<li>Item 3C</li>
</ul>
</li>
</ul>
JS
$("li").on("mouseenter", function () {
if ($(this).hasClass("active")) {
$(this).css("color", "red");
$(this).parent().parent().find("span").css("color", "red");
}
});
为此,您需要将Item 2
文本包装在一个包含元素(例如span
,否则所有子元素的颜色也会更改。
然后,您可以使用.parent.closest('li')
来获取li
,然后再使用children()
来获取该span
。 尝试这个:
$("ul").on("mouseenter mouseleave", 'li.active', function(e) { var $target = $(this).parent().closest('li').children('span'); $target.add(this).toggleClass('hover', e.type == 'mouseenter'); });
.active { font-weight: bold; } .hover { color: red; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <ul> <li> <span>Item 1</span> <ul> <li>Item 1A</li> <li>Item 1B</li> <li>Item 1C</li> </ul> </li> <li> <span>Item 2</span> <ul> <li>Item 2A</li> <li class="active">Item 2B</li> <li>Item 2C</li> </ul> </li> <li> <span>Item 3</span> <ul> <li>Item 3A</li> <li>Item 3B</li> <li>Item 3C</li> </ul> </li> </ul>
请注意,在调用closest()
之前需要parent()
调用,因为closest()
将与当前的li
元素匹配,这是我们不希望的,因此需要parent()
来“跳越”该元素。
我可能会这样做:
li
本身使用标准:hover
规则 li
使用类而不是直接样式 li
下的ul
元素(及其子元素)的颜色 像这样:
$("li") .on("mouseenter", function() { if ($(this).hasClass("active")) { $(this).parent().closest("li").addClass("has-active"); } }) .on("mouseleave", function() { if ($(this).hasClass("active")) { $(this).parent().closest("li").removeClass("has-active"); } });
li { color: black; } li.has-active { color: red; } li.active:hover { color: red; } .has-active ul { color: black; }
<ul> <li>Item 1 <ul> <li>Item 1A</li> <li>Item 1B</li> <li>Item 1C</li> </ul> </li> <li>Item 2 <ul> <li>Item 2A</li> <li class="active">Item 2B</li> <li>Item 2C</li> </ul> </li> <li>Item 3 <ul> <li>Item 3A</li> <li>Item 3B</li> <li>Item 3C</li> </ul> </li> </ul> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.