2009-09-28 55 views
5

我有这样的菜单:我可以使用jQuery轻松地将li元素向上或向下移动吗?

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

有没有我可以使用jQuery重新整理元素的简单方法?我想像这样的:

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

但是,任何其他方式来实现这一点,表示赞赏。

回答

22

这其实并不难。 JQuery几乎可以让你自己使用“insertBefore”和“insertAfter”方法。

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

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

,您可以用这些像 下移($( '#menuAbout')); 和menuAbout项目会向下移动。

如果你想扩展jQuery来包括这些方法,你会写这样的:

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

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

,现在你可以调用的功能,如 $(“#menuAbout”)下移()。

+0

为什么你为每个变量使用$变量,而不仅仅是变量?不是它是无效的语法 - 它只是多余的。 – 2009-09-28 10:03:16

+8

是的。但它也提醒我,我正在处理一个jQuery对象与常规变量/ DOM对象。 – villecoder 2009-09-30 13:36:44

5

没有原生的原型方法,但你可以做一个轻松:

$.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() 

它使用jQuery.prototype.after

+1

您可以通过复制函数并用'before'和'append(this)'用'prepend(this)'替换'after'来实现moveUp。 – 2009-09-28 02:34:04

相关问题