2012-04-17 62 views
1

在繼續,爲javascript sort of HTML elementsJavaScript的HTML元素的排序就地

我想排序在不同<ol>(最終在<div>) 排序元素最好應就地而不是unwrap()sort()wrap

HTML

<ol class="table" style="display: block; "> 
    <li class="menu__run">I</li> 
    <li class="menu__run">IXX</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
</ol> 
<ol class="table"> 
    <li class="menu__run">I</li> 
    <li class="menu__run">IXX</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__test">st</li> 
    <li class="menu__test">st</li> 
    <li class="menu__test">st</li> 
</ol> 

的JavaScript

var sort_by_name = function(a, b) { 
    return a.innerHTML.toLowerCase().localeCompare(b.innerHTML.toLowerCase()); 
} 

var list = $(".table > li").get(); 
list.sort(sort_by_name); 
for (var i = 0; i < list.length; i++) { 
    list[i].parentNode.appendChild(list[i]); 
}​ 

結果我尋找是

<ol class="table" style="display: block; "> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
</ol> 
<ol class="table"> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">I</li> 
    <li class="menu__run">IXX</li> 
    <li class="menu__run">IXX</li> 
    <li class="menu__test">st</li> 
    <li class="menu__test">st</li> 
    <li class="menu__test">st</li> 
</ol> 

讓A,B是DOM元素,並且該列表除了B上的出現降低(下層是文檔中的位置)和值(一)>值(b)然後a和b將被切換到文件中。不管a和b可能不是兄弟姐妹。

http://jsfiddle.net/yqd3w/7/

+5

問題是什麼?你有工作排序代碼。您可以使用該類型的代碼對列表排序。 – jfriend00 2012-04-17 07:47:51

+1

在什麼地方會有什麼邏輯?似乎隨機... – 2012-04-17 07:53:34

+0

如果我查詢來自不同父母的元素的DOM,我希望他們之間進行排序。 – shevski 2012-04-17 07:54:31

回答

4

要由少做比較,你可以做加速任務了:

$(".table").each(function(){ 
    var list = $(this).children().get().sort(sort_by_name); 
    for (var i = 0; i < list.length; i++) 
     this.appendChild(list[i]); 
}​); 

...雖然不影響結果。


編輯:好的,我給你:

var $t = $(".table"); 
var list = $t.children().get().sort(sort_by_name); 
$t.map(function() { 
    return {t:this, l:this.childNodes.length}; 
}).each(function(i, o) { 
    $(o.t).append(list.splice(0, o.l)); 
}); 
+0

在第一個'table'有一個元素與'IXX'文本,它需要移動到第二個'表' – shevski 2012-04-17 08:05:46

+0

已更新。第二個代碼是你想要的 – Bergi 2012-04-17 10:47:15

+0

這是非常好的謝謝你 – shevski 2012-04-18 11:20:45