我能使用jQuery轻松地将li元素向上或向下移动吗?

12
我有一个像这样的菜单:
    <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()

但是任何其他实现该目标的方式都会受到赞赏。

3个回答

33

实际上并不难。使用jQuery的 insertBeforeinsertAfter 方法就可以完成大部分工作。

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

function moveDown($item) {
    $after = $item.next();
    $item.insertAfter($after);
}
你可以这样使用:

你可以像这样使用它们

moveDown($('#menuAbout'));

菜单项“关于”将会向下移动。

如果您想要扩展 jQuery 来包含这些方法,您可以编写如下代码:

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

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

现在您可以调用这些函数,例如:

$("#menuAbout").moveDown();

为什么每个变量都要用$variable,而不是只用variable?虽然这不是无效的语法,但有点多余。 - Jeremy Visser
11
没错,但这也提醒我,我正在处理一个 jQuery 对象而不是普通的变量/DOM 对象。 - villecoder

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
你可以通过复制该函数并将 'after' 替换为 'before',将 'append(this)' 替换为 'prepend(this)' 来实现 moveUp。 - meder omuraliev

1
您也可以在父元素上使用 display: flex,然后可以使用 order

function reset()
{
  jQuery("#a").css("order", 10);
  jQuery("#b").css("order", 20);
  jQuery("#c").css("order", 30);
}

function reorder1()
{
  jQuery("#a").css("order", 30);
  jQuery("#b").css("order", 20);
  jQuery("#c").css("order", 10);
}

function reorder2()
{
  jQuery("#a").css("order", 30);
  jQuery("#b").css("order", 10);
  jQuery("#c").css("order", 20);
}
#main { display: flex; }
#a { color: red; }
#b { color: blue; }
#c { color: green; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="main">
    <div id="a">Foo</div>
    <div id="b">Bar</div>
    <div id="c">Baz</div>
</div>

<button onclick="reset()">Reset</button>
<button onclick="reorder1()">Reorder 1</button>
<button onclick="reorder2()">Reorder 2</button>


1
当我发布问题时,这不是一个事情,但是现在可以了。 - George Mauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接