2009-09-28 12 views
5

Mam menu jak poniżej:Czy mogę używać jQuery do łatwego przesuwania elementów li w górę lub w dół?

<ul id="menu" class="undecorated"> 
     <li id="menuHome"><a href="/">Home</a> </li> 
     <li id="menuAbout"><a href="/Usergroup/About">About</a> </li> 
     <li id="menuArchives"><a href="/Usergroup/Archives">Archives</a> </li> 
     <li id="menuLinks"><a href="/Usergroup/Links">Links</a> </li> 
    </ul> 

Czy istnieje prosty sposób, że można używać jQuery ponowne zamawianie elementów? Wyobrażam sobie coś takiego:

$('#menuAbout').moveDown().moveDown() 

Ale każdy inny sposób osiągnięcia tego jest mile widziany.

Odpowiedz

22

To nie jest rzeczywiście takie trudne. JQuery prawie dostanie się tam sam dzięki metodom "insertBefore" i "insertAfter".

function moveUp($item) { 
    $before = $item.prev(); 
    $item.insertBefore($before); 
} 

function moveDown($item) { 
    $after = $item.next(); 
    $item.insertAfter($after); 
} 

Można z nich korzystać jak moveDown ($ ('# menuAbout')); i menuO pozycji przesunąłby się w dół.

Jeśli chciał przedłużyć jQuery do uwzględnienia tych metod, należy napisać to tak:

$.fn.moveUp = function() { 
    before = $(this).prev(); 
    $(this).insertBefore(before); 
} 

$.fn.moveDown = function() { 
    after = $(this).next(); 
    $(this).insertAfter(after); 
} 

a teraz można wywoływać funkcje jak $ ("# menuAbout") moveDown();.

+0

Dlaczego używasz zmiennej $ dla każdej zmiennej, a nie tylko zmiennej? Nie jest to nieprawidłowa składnia - jest po prostu zbyteczna. –

+8

Prawda. Ale to również przypomina mi, że mam do czynienia z obiektem jQuery w porównaniu ze zwykłą zmienną/obiektem DOM. – villecoder

5

Brak rodzimych metod prototypal, ale można zrobić jeden prosty sposób:

$.fn.moveDown = function() { 
    return this.each(function() { 
     var next = $(this).next(); 
     if (next.length) { 
      $(next).after(this); 
     } else { 
      $(this).parent().append(this); 
     } 
    }) 
} 

$('#menuAbout').moveDown().moveDown() 

używa jQuery.prototype.after

+1

Możesz zaimplementować moveUp, kopiując funkcję i zastępując "po" przez "przed" i "dopisz (to)" za pomocą "prepend (this)". –

Powiązane problemy