如果你想进行排序的自定义数据属性,这里就是我在过去所做的那样:
HTML:
<ul class="sortList">
<li data-sort="1">I am number one</li>
<li data-sort="7">I am number seven</li>
<li data-sort="22">I am number twenty two</li>
<li data-sort="2">I am number two</li>
</ul>
因为列表不是为了和它的不连续的,这样做的那种最简单的方法是使用JavaScript的排序方法一个jQuery选择阵列上:
的javascript:
var list = $('.sortList');
var listItems = list.find('li').sort(function(a,b){ return $(a).attr('data-sort') - $(b).attr('data-sort'); });
list.find('li').remove();
list.append(listItems);
因为jQuery返回一个元素数组,所以本地排序方法会给你一个排序数组的选择器,你可以用列表的内容来替换它。
排序后,您的名单将是这样的:
<ul class="sortList">
<li data-sort="1">I am number one</li>
<li data-sort="2">I am number two</li>
<li data-sort="7">I am number seven</li>
<li data-sort="22">I am number twenty two</li>
</ul>
有一点要注意的还有:我使用数据排序的属性,因为以“数据 - ”区别对待启动属性通过浏览器,所以这不会导致验证问题。
///////编辑:
考虑您的意见,这里是另一种方式来做到这一点无需更换整个阵列。这几乎肯定会慢一些,需要提炼,我仍然建议使用上述解决方案,但如果你想在不修改清单追加:
//// This would happen inside a function somewhere
var list = $('ul li');
var newItem = $('<li data-sort="7"></li>'); // I assume you will be getting this from somewhere
$.each(list,function(index,item){
var prev = parseFloat($(item).attr('data-sort'));
var next = parseFloat($(list[index+1]).attr('data-sort'));
var current = parseFloat(newItem.attr('data-sort'));
if(prev <= current && (next > current || isNaN(next))){
$(item).after(newItem);
} else if(current > prev){
$(item).before(newItem);
}
});
这似乎很好。如果在调用排序函数之前将一个对象附加到.sortList,它也会对该对象进行排序。如果在调用该函数后使用单击事件创建对象,则需要再次运行此函数才能使用。我正在寻找一些不需要在每次引入新对象时都需要创建数组的地方 – TaylorMac 2011-05-20 19:57:35
我在答案中增加了另一个解决方案,但说实话,我想不出一个sort()不会用到的用例对您的问题最快速/最干净的解决方案。你可以随意多次运行它,它不会混淆你的元素或周围的任何东西。 – Jesse 2011-05-20 20:38:38