2012-01-12 48 views
8

我有一組三個列表項,我想在頁面加載時自動從高到低顯示。理想情況下使用jQuery或JavaScript。用javascript對html列表排序

<ul class="list"> 
<li id="alpha">32</li> 
<li id="beta">170</li> 
<li id="delta">28</li> 
</ul> 

每個列表項都需要自己的ID,因爲它們每個都有單獨的背景圖像。這些數字必須是文本節點,以便用戶可以編輯它們。使用jQuery的幫助http://jsfiddle.net/B7hdx/1

+0

看到這裏 http://stackoverflow.com/q/1134976/771300 – 2012-01-12 15:08:00

+0

@maerics我嘗試originaly從頭開始構建它與數組 'function listSort(a,B) { return a -b; } var n = [「10」,「775」,「40」,「1125」,「1」,「8」]; document.write(n.sort(listSort));' 我得到儘可能按順序重新排列列表,但不能指望它與不同的列表ID一起工作。 – danssker 2012-01-12 17:21:54

回答

11

這可能會做的最快的方法,因爲它不使用jQuery:

function sortList(ul){ 
    var new_ul = ul.cloneNode(false); 

    // Add all lis to an array 
    var lis = []; 
    for(var i = ul.childNodes.length; i--;){ 
     if(ul.childNodes[i].nodeName === 'LI') 
      lis.push(ul.childNodes[i]); 
    } 

    // Sort the lis in descending order 
    lis.sort(function(a, b){ 
     return parseInt(b.childNodes[0].data , 10) - 
       parseInt(a.childNodes[0].data , 10); 
    }); 

    // Add them into the ul in order 
    for(var i = 0; i < lis.length; i++) 
     new_ul.appendChild(lis[i]); 
    ul.parentNode.replaceChild(new_ul, ul); 
} 

呼叫的功能等:

sortList(document.getElementsByClassName('list')[0]); 

您可以按其他列表以同樣的方式,如果你在列表類的同一頁面上有其他元素,你應該給你的ul一個id,然後用它來傳遞它。

Example JSFiddle

編輯

既然你提到你希望它在頁面加載發生,我假設你想後UL是,這意味着你應該添加DOM它儘快發生功能sortList到你的頁面的頭部,然後將列表後立即使用它像這樣:

<head> 
    ... 
    <script type="text/javascript"> 
     function sortList(ul){ 
      var new_ul = ul.cloneNode(false); 
      var lis = []; 
      for(var i = ul.childNodes.length; i--;){ 
       if(ul.childNodes[i].nodeName === 'LI') 
        lis.push(ul.childNodes[i]); 
      } 
      lis.sort(function(a, b){ 
       return parseInt(b.childNodes[0].data , 10) - parseInt(a.childNodes[0].data , 10); 
      }); 
      for(var i = 0; i < lis.length; i++) 
       new_ul.appendChild(lis[i]); 
      ul.parentNode.replaceChild(new_ul, ul); 
     } 
    </script> 
</head> 
<body> 
    ... 
    <ul class="list"> 
     <li id="alpha">32</li> 
     <li id="beta">170</li> 
     <li id="delta">28</li> 
    </ul> 
    <script type="text/javascript"> 
     !function(){ 
      var uls = document.getElementsByTagName('ul'); 
      sortList(uls[uls.length - 1]); 
     }(); 
    </script> 
    ... 
</body> 
+0

這很美麗 - 魅力十足。現在試試看你寫的東西..! – danssker 2012-01-12 17:07:41

+0

注意:IE9以前版本的IE不支持更多的代碼,因爲'getElementsByClassName()'在老版本的IE中不存在。 – jfriend00 2012-01-12 17:41:36

+2

@danssker - 如果你已經使用jQuery,爲什麼你會選擇更簡單的jQuery版本的更復雜的原生JavaScript版本?你真的能看到像這樣的操作的性能差異?我在這方面的口號是:首先要簡單,只有在絕對需要時纔會增加複雜性。 – jfriend00 2012-01-12 17:44:47

5

你可以試試這個

var ul = $(".list:first"); 
var arr = $.makeArray(ul.children("li")); 

arr.sort(function(a, b) { 
    var textA = +$(a).text(); 
    var textB = +$(b).text(); 

    if (textA < textB) return -1; 
    if (textA > textB) return 1; 

    return 0; 
}); 

ul.empty(); 

$.each(arr, function() { 
    ul.append(this); 
}); 

活生生的例子

var sortFunction = function(a, b) { 
    return (+($(b).text())) - (+($(a).text())); 
} 
var lis = $('ul.list li'); 
lis = Array.prototype.sort.call(lis, sortFunction); 

for (var i = 0; i < lis.length; i++) { 
    $('ul.list').append(lis[i]); 
} 

Fiddle Link

+1

你完全測試過你的實例嗎?它顯示「170 28 32」 – Gran 2012-01-12 15:09:00

+0

它按字母順序排序,但我已經修復它 – Francis 2012-01-12 15:10:57

+0

從最高到最低。 http://jsfiddle.net/B7hdx/2/ FTFY – 2012-01-12 15:25:25

1

一種方法可能是sort an array(當然,一jQuery對象)的li個元件和與元件的排序後的數組代替ul的內容(使用html法):

$(".list").html($(".list li").sort(function(a, b) { 
    return parseInt($(b).text(), 10) - parseInt($(a).text(), 10);  
})); 

這裏的一個working example

+0

謝謝,看起來不錯,但..不知道排序陣列在這裏工作正常嗎?看起來像是按照第一位數排序,而不是實際值。 – danssker 2012-01-12 17:12:41

0

您可以使用此方法:

var mylist = $('ul'); 
var listitems = mylist.children('li').get(); 
listitems.sort(function(a, b) { 
    var compA = $(a).text().toUpperCase(); 
    var compB = $(b).text().toUpperCase(); 
    return (compA < compB) ? -1 : (compA > compB) ? 1 : 0; 
}) 
$.each(listitems, function(idx, itm) { mylist.append(itm); }); 

檢查這裏的文章: http://www.onemoretake.com/2009/02/25/sorting-elements-with-jquery/

編輯:有一個非常酷的jQuery插件,做的是:http://tinysort.sjeiti.com/

1

像這樣的東西應該有所幫助:

var $parent = $(".list"); 

$(".list li").sort(function (a, b) { 
    return window.parseInt($(a).text(), 10) - window.parseInt($(b).text(), 10); 
}).remove().each(function() { 
    $parent.append($(this)); 
}); 
3

此代碼將對該列表進行排序,假定只有一個.list項目:

function sortList(selector) { 
    var parent$ = $(selector); 
    parent$.find("li").detach().sort(function(a, b) { 
     return(Number(a.innerHTML) - Number(b.innerHTML)); 
    }).each(function(index, el) { 
     parent$.append(el); 
    }); 
} 

sortList(".list"); 

你可以看到它在這裏工作:http://jsfiddle.net/jfriend00/FjuMB/

解釋它是如何工作的:

  1. 它得到.LIST父對象。
  2. 它找到所有<li>子對象。
  3. 它刪除所有從DOM <li>子對象,但保留其數據
  4. 它使用自定義排序功能
  5. 自定義排序函數獲取的L1標籤的HTML並將其轉換爲一個排序李對象
  6. 然後,按照新排序的順序遍歷數組,每個li標籤都被追回到原始父元素上。

結果是它們按排序順序顯示。

編輯:

這種改進的版本將有一次甚至排序多個列表對象:

function sortList(selector) { 
    $(selector).find("li").sort(function(a, b) { 
     return(Number(a.innerHTML) - Number(b.innerHTML)); 
    }).each(function(index, el) { 
     $(el).parent().append(el); 
    }); 
} 

sortList(".list"); 

演示:http://jsfiddle.net/jfriend00/RsLwX/

0

排序jQuery的收集和往常一樣數組,然後每個元素追加回按正確的順序。

$(".list li").sort(function(a, b) { 
    return parseInt($(b).text(), 10) - parseInt($(a).text(), 10);  
}).appendTo('.list'); 

http://jsfiddle.net/zMmWj/

6

你可以使用這個輕量級的jQuery插件List.js原因

  1. 它是輕量級的[僅3K腳本]:這將使您的排序不外乎類
  2. 搜索,排序和過濾

HTML

<div id="my-list"> 
    <ul class="list"> 
     <li> 
      <h3 class="name">Luke</h3> 
     </li> 
     <li> 
      <h3 class="name">John</h3> 
     </li> 
    </ul> 
</div> 

的Javascript

var options = { 
    valueNames: ['name'] 
}; 
var myList = new List('my-list', options); 
0

非jQuery的版本(香草的javascript)

優點:列表代替排序,不破壞LI的,也不刪除可能與其關聯的任何事件。它只是洗牌周圍

添加一個ID,UL事情:

<ul id="myList" class="list"> 
    <li id="alpha">32</li> 
    <li id="beta">170</li> 
    <li id="delta">28</li> 
</ul> 

和香草的JavaScript(無jQuery的)

// Grab a reference to the UL 
var container = document.getElementById("myList"); 

// Gather all the LI's from the container 
var contents = container.querySelectorAll("li"); 

// The querySelector doesn't return a traditional array 
// that we can sort, so we'll need to convert the contents 
// to a normal array. 
var list = []; 
for(var i=0; i<contents.length; i++){ 
    list.push(contents[i]); 
} 

// Sort based on innerHTML (sorts "in place") 
list.sort(function(a, b){ 
    var aa = parseInt(a.innerHTML); 
    var bb = parseInt(b.innerHTML); 
    return aa < bb ? -1 : (aa > bb ? 1 : 0); 
}); 

// We'll reverse the array because our shuffle runs backwards 
list.reverse(); 

// Shuffle the order based on the order of our list array. 
for(var i=0; i<list.length; i++){ 
    console.log(list[i].innerHTML); 
    container.insertBefore(list[i], container.firstChild); 
} 

和提琴證明:https://jsfiddle.net/L27gpnh6/1/