重新排序列表元素 - jQuery?

时间:2010-06-16 05:03:04

标签: javascript jquery

是否可以使用JavaScript或纯jQuery重新排序<li>元素。所以如果我有一个如下的愚蠢列表:

<ul>
    <li>Foo</li>
    <li>Bar</li>
    <li>Cheese</li>
</ul>

如何移动列表元素?就像将列表元素与Cheese放在列表元素之前Foo或将Foo移到Bar之后。

有可能吗?如果是这样,怎么样?

6 个答案:

答案 0 :(得分:82)

var ul = $("ul");
var li = ul.children("li");

li.detach().sort();
ul.append(li);

这是一个简单的示例,其中<li>个节点按默认顺序排序。我正在调用detach以避免删除与li节点相关的任何数据/事件。

您可以传递一个函数进行排序,并使用自定义比较器进行排序。

li.detach().sort(function(a, b) {
   // use whatever comparison you want between DOM nodes a and b
});

答案 1 :(得分:34)

如果有人希望通过逐步向上/向下移动一些列表来重新排序元素......

//element to move
var $el = $(selector);

//move element down one step
if ($el.not(':last-child'))
    $el.next().after($el);

//move element up one step
if ($el.not(':first-child'))
    $el.prev().before($el);

//move element to top
$el.parent().prepend($el);

//move element to end
$el.parent().append($el);

答案 2 :(得分:8)

关于jQuery,我最喜欢的一件事就是如此快速地编写小小的附加组件是多么容易。

在这里,我们创建了一个小插件,它带有一系列选择器,并使用它来命令目标元素的子节点。

&#13;
&#13;
// Create the add-on

$.fn.orderChildren = function(order) {
	this.each(function() {
		var el = $(this);
		for(var i = order.length - 1; i >= 0; i--) {
			el.prepend(el.children(order[i]));
		}
	});
	return this;
};


// Call the add-on

$(".user").orderChildren([
	".phone",
	".email",
	".website",
	".name",
	".address"
]);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<ul class="user">
	<li class="name">Sandy</li>
	<li class="phone">(234) 567-7890</li>
	<li class="address">123 Hello World Street</li>
	<li class="email">someone@email.com</li>
	<li class="website">https://google.com</li>
</ul>
<ul class="user">
	<li class="name">Jon</li>
	<li class="phone">(574) 555-8777</li>
	<li class="address">123 Foobar Street</li>
	<li class="email">jon@email.com</li>
	<li class="website">https://apple.com</li>
</ul>
<ul class="user">
	<li class="name">Sarah</li>
	<li class="phone">(432) 555-5477</li>
	<li class="address">123 Javascript Street</li>
	<li class="email">sarah@email.com</li>
	<li class="website">https://microsoft.com</li>
</ul>
&#13;
&#13;
&#13;

该函数向后循环遍历数组并使用.prepend,以便将任何未选中的元素推送到最后。

答案 3 :(得分:6)

这是一个jQuery插件,可以帮助实现此功能:http://tinysort.sjeiti.com/

答案 4 :(得分:4)

这样的事情?

​var li = $('ul li').map(function(){
              return this;
         })​.get();
$('ul').html(li.sort());

demo

我有点失落你可能想要这样的东西......

$('ul#list li:first').appendTo('ul#list'); // make the first to be last...
$('ul#list li:first').after('ul#list li:eq(1)'); // make first as 2nd...
$('ul#list li:contains(Foo)').appendTo('ul#list'); // make the li that has Foo to be last...

更多here1here2

答案 5 :(得分:3)

看一下jquery ui sortable

http://jqueryui.com/demos/sortable/