2013-08-21 63 views
0

我有一個項目列表。頂部的一些項目有一個類。如何移動具有類的元素下的元素

<ul> 
    <li class="blue moveMeDown">1</li> 
    <li class="blue">2</li> 
    <li class="blue">3</li> 
    <li class="blue">4</li> 
    <li>5</li> 
    <li>6</li> 
    <li>7</li> 
</ul> 

我試着寫了jQuery移動項目1向下跌破項目與類blue。要定位與該類的最後一個項目,我使用的是這樣的:

$elm.nextUntil(":not(.blue)").last() 

這似乎是一個爛攤子,而且如果只有1 blue項目甚至不工作。必須有更好的方法來做到這一點。

Here's the JSfiddle

當前的jQuery:

$("ul").on("click", ".moveMeDown", function(e){   
    var $elm = $(this); 
     $elm 
     .insertAfter($elm.nextUntil(":not(.blue)").last()) 
     .removeClass("blue"); 

}); 

回答

2

我建議:

$('ul').on('click', '.moveMeDown', function(){ 
    var self = $(this); 
    self.insertAfter(self.parent().find('.blue').last()).removeClass('blue'); 
}); 

JS Fiddle demo

另外,如T.J.克勞德指出,in the comment below,以下也適用:

$('ul').on('click', '.moveMeDown', function(){ 
    var self = $(this); 
    self.insertAfter(self.siblings('.blue').last()).removeClass('blue'); 
}); 

JS Fiddle demo

參考文獻:

+2

是的,應該這樣做。 'self.parent()。find('。blue')'可能是'self.siblings('。blue')',只是爲了避免與後代非同胞元素的交互。 –

0

試試這個:

$("ul").on("click", ".moveMeDown", function(e){   
    var $elm = $(this); 
    $(".blue:last").after($elm.removeClass("blue"));  
}); 

或者,

$("ul").on("click", ".moveMeDown", function(e){   
    var $lastBlue = $(this).parent().find(".blue").last(), 
     $elm = $(this); 

    $lastBlue.after($elm.removeClass("blue"));  
}); 

小提琴這裏:http://jsfiddle.net/Xb7ue/7/

+0

不是一個好主意,原因有兩個:1.它會在任何地方找到最後一個'.blue'元素**,而不僅僅是在同一個列表的上下文中。 2.使用jQuery的CSS擴展(':last'),其中可避免的是阻止jQuery移交給瀏覽器的本機'querySelectorAll',幾乎所有的瀏覽器都會影響性能。實際上,使用'last'方法會更好,這看起來可能與直覺相反。 –

相關問題