2013-12-18 36 views
2

示例HTML:JQuery .not(next) - 有可能吗?

<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> 

使用slideToggle,如果我点击第一个div moreCats我想未来subCats到slideDown它一定。同时我想slideUp任何其他开放subCats,但不是,我正在切换,否则它会关闭然后重新打开,这是它做的。

问题:这有效吗?如果不是有类似的东西?

$('div.subCats').not($(this).next('.subCats')).slideUp(); 

下面是完整的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  
}); 
+0

'next'将**立即**下一个元素,并匹配选择器。那真的是你需要的吗? – elclanrs

+0

为什么你不用一个类来注释你将要改变的类,然后把这个改变应用到没有那个类的所有东西上。可能与你所做的有点相似,但如果班级模仿一种状态,它可能会更好。 – bitoiu

回答

1

您可以通过放置的slideToggle为当前的目标(这将返回元素)内.not它们结合在一起,你要选择的父母接下来还有

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

Demo

如果你想拆分它们,那么最好缓存下一个,而不是再次选择它。

$('#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() 
}); 
1

你有什么是有效的,但它不会做你所期望的,.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"); 
1

.moreCats没有任何兄弟姐妹,所以你不能使用.next()。你真正需要的是获得this父母的下一个兄弟姐妹。所以,如果你$(this)>.parent()>.next('.subCats')

$('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  
}); 

去一个例子来看看这个JSFiddle