Javascript 不是(下一个)-可能吗?

Javascript 不是(下一个)-可能吗?,javascript,jquery,Javascript,Jquery,HTML示例: <div class=blah> <div class=moreCats></div> </div> <div class=subCats>.......</div> <div class=blah> <div class=moreCats></div> </div> <div class=subCats>.......</d

HTML示例:

<div class=blah>
    <div class=moreCats></div>
</div>
<div class=subCats>.......</div>

<div class=blah>
    <div class=moreCats></div>
</div>
<div class=subCats>.......</div>

<div class=blah>
    <div class=moreCats></div>
</div>
<div class=subCats>.......</div>
这是我正在尝试的完整JQuery

// show children cat items
$('#sideNav').on("click", ".moreCats", function() {         
    $('div.subCats').not($(this).next('.subCats')).slideUp(); // close all except next
    $(this).next('.subCats').slideToggle(); // slideToggle next     
});

您可以通过将当前目标(将返回该元素)的滑块切换放置在
中来组合它们。而不是
,您还需要选择父对象的下一个

$('#sideNav').on("click", ".moreCats", function() {         
    $('div.subCats').not($(this).parent().next('.subCats').slideToggle()).slideUp(); 
    //or do $(this).closest('.blah').next('.subCats');
});

如果要拆分它们,最好缓存下一个,而不是再次选择它

 $('#sideNav').on("click", ".moreCats", function() {   
     var $target = $(this).parent().next('.subCats');      
     $('div.subCats').not($target.slideToggle()).slideUp(); 
     //or just do as below
    //$('div.subCats').not($target).slideUp(); 
    //$target.slideToggle()
});

您所拥有的是有效的,但它没有达到您期望的效果,
.next()
选择下一个直接同级元素,您应该首先选择父元素:

$('div.subCats').not($(this.parentNode).next('.subCats')).slideUp();
您还可以使用
.index()
方法:

$('#sideNav').on({
    click: function() {
       var $sub = $('div.subCats'), 
           i    = $('#sideNav .moreCats').index(this);

       $sub.not( $sub.eq(i).slideToggle() ).slideUp(); 
    }         
}, ".moreCats");

.moreCats
没有任何兄弟姐妹,因此您不能使用
.next()
。你真正需要的是得到这个
的父母的下一个兄弟姐妹。所以您从
$(this)
.parent()
.next('.subCats')


请参见此示例。

next
获取紧邻的下一个元素,并与选择器匹配。这真的是你需要的吗?为什么你不用一个类来注释你要修改的类,然后把修改应用到没有这个类的所有东西上呢。可能有点类似于您所做的,但如果该类对状态进行simbolized,那么它的可读性可能会更好。
$('#sideNav').on({
    click: function() {
       var $sub = $('div.subCats'), 
           i    = $('#sideNav .moreCats').index(this);

       $sub.not( $sub.eq(i).slideToggle() ).slideUp(); 
    }         
}, ".moreCats");
$('body').on("click", ".moreCats", function() {     
    console.log($(this).parent().next('.subCats'));
    $('div.subCats').not($(this).parent().next('.subCats')).slideUp(); // close all except next
    $(this).parent().next('.subCats').slideToggle(); // slideToggle next     
});