2011-05-20 65 views
0

这个功能似乎运作得相当好基于ID进行排序的div:如何根据自定义属性来订购动态创建的元素?

JS

var div = $("<div id='3.5'>AA</div>"); 
div_id_after = Math.floor(parseFloat(div.get(0).id)); 

$('#'+div_id_after).after(div); 

HTML

<div id='1'>a</div> 
<div id='2'>b</div> 
<div id='3'>c</div> 
<div id='4'>d</div> 
<div id='5'>e</div> 

产地:

一个
b
Ç
AA
d
Ë

但如果我想用标题为“令”自定义属性?

该ID不应该是兼容性问题的编号,但是这个相同的规则是否适用于自定义属性?

回答

11

如果你想进行排序的自定义数据属性,这里就是我在过去所做的那样:

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); 
    } 
}); 
+0

这似乎很好。如果在调用排序函数之前将一个对象附加到.sortList,它也会对该对象进行排序。如果在调用该函数后使用单击事件创建对象,则需要再次运行此函数才能使用。我正在寻找一些不需要在每次引入新对象时都需要创建数组的地方 – TaylorMac 2011-05-20 19:57:35

+0

我在答案中增加了另一个解决方案,但说实话,我想不出一个sort()不会用到的用例对您的问题最快速/最干净的解决方案。你可以随意多次运行它,它不会混淆你的元素或周围的任何东西。 – Jesse 2011-05-20 20:38:38

3

它看起来像TinySort会做你想做的。

$("ul").tsort({attr:"order"}); 

快速谷歌搜索后还感兴趣的是另一个SO Question

+1

我敢肯定,这是偏好的问题,但我个人止跌为此,不使用插件 - jQuery返回一个数组,这对排序非常有用。保持你的JavaScript灯光,并避免插件,除非绝对必要。也就是说,做你想做的事情,除非我必须稍后维护你的代码。 – Jesse 2011-05-20 19:52:35

+0

我真的很想找一些动态创建的对象在正确的位置追加(之前或之前的任何一种方式) – TaylorMac 2011-05-20 20:00:45

+3

@Jesse,我一般都认为插件地狱是可以避免的,但在这种情况下插件相当小而且代码非常容易阅读单行,所以它似乎适用于KISS和DRY方法。但无论如何TaylorMac,做你觉得适合你的代码。 – Mike 2011-05-21 01:21:56

相关问题