2011-05-20 62 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

相關問題