如果我这样做:
$("a").on("click", function(e) {
$(this).parent().find("ul").toggleClass("closed opened");
e.preventDefault();
});
它有效,但它将针对父母的所有人
所以我在做
$("a").on("click", function(e) {
$(this).parent().next("ul").toggleClass("closed opened");
e.preventDefault();
});
但这不起作用,我根本没有错误。
如果我使用这里使用的html对JSFiddle进行以下工作:
$("a").on("click", function(e) {
$(this).next("ul").toggleClass("closed opened");
e.preventDefault();
});
没有意义。我需要定位我要点击的父元素的第一个<ul>
子元素。
<ul>
<li><a href="">Text</a>
<ul class="closed">
<li><a href="">Two</a>
<ul class="closed">
<li><a href="">Three</a>
<ul class="closed">
<li><a href="">Four</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
.closed {
display: none;
}
.opened {
display: block;
}
JSFiddle使用示例中使用的html
更新
感谢评论,因为我的真实html有一个
<span>
元素,我不得不使用.nextAll()
实际HTML
<ul>
<li>
<a href="">Text</a>
<span></span>
<ul class="closed">
<li>
<a href="">Two</a>
<span></span>
<ul class="closed">
<li>
<a href="">Three</a>
<span></span>
<ul class="closed">
<li><a href="">Four</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
答案 0 :(得分:2)
点击的a
元素的父元素是li
元素。父li
元素的下一个兄弟元素只能是其他li
元素。所以脚本根本无法选择目标元素,它实际上是有意义的,因为.next
只选择下一个[匹配]兄弟姐妹。
幸运的是,你有一个正常工作的版本!
答案 1 :(得分:2)
您要找的是siblings()
而不是next()
$("a").on("click", function(e) {
$(this).siblings("ul").toggleClass("closed opened");
e.preventDefault();
});
next
未与您合作的原因在于您尝试使用它的方式。
您先使用parent()
,然后要求获取next()
类型的ul
元素,这与next
的工作方式不符。
因为在您的DOM结构中,next
后的parent
元素将成为您的锚标记,next
只会与 匹配你的dom中的第一个元素,而不是与你的选择器匹配的第一个元素,这是你误用的根本原因。
考虑使用选择器的next
如何工作的官方说明:
该方法可选地接受我们可以传递给$()函数的相同类型的选择器表达式。如果紧随其后的兄弟匹配选择器,它将保留在新构造的jQuery对象中;否则,它被排除在外。
nextall
也可以做到这一点。
答案 2 :(得分:0)
试试这个:
$("a").on("click", function(e) {
$(this).closest("ul").toggleClass("closed opened");
e.preventDefault();
});
答案 3 :(得分:0)
我需要定位我点击的父元素的第一个孩子
$(this).next("ul").toggleClass("closed opened");
<a>
或$(this)
有<ul>
作为兄弟,所以直接从$(this)
引用.next()
时使用正确的方法就是问题。在我理解的情况下,没有必要在这种情况下引用父母。