2013-08-21 4 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> 

나는 클래스 blue으로 항목 아래에 아래 항목 하나를 이동 jQuery를 작성하는 것을 시도하고있다. 그 클래스와 마지막 항목을 대상으로 지정하려면, 내가 이것을 사용하고 있습니다 :

엉망 것 같아, 만 1 blue 항목이 있으면 그것도 작동하지 않습니다
$elm.nextUntil(":not(.blue)").last() 

. 이것을하기위한 더 좋은 방법이 있어야합니다.

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')을 사용하면 브라우저의 네이티브'querySelectorAll'에 jQuery가 전달되는 것을 막을 수 있습니다. 거의 모든 브라우저에서 성능이 저하됩니다. 실제로는 '마지막'방법을 사용하는 것이 좋습니다. 반 직관적으로 보일 수 있습니다. –

관련 문제