2011-03-25 39 views
2

問題是我有一個聯繫人列表,當有人改變他/她的狀態時,我嘗試將它們移動到列表的頂部。一切工作到現在,與IE9,和Firefox 4不工作。我告訴你的代碼:JavaScript排序不與IE9一起使用?

function sortByStatus() 
{ 

    var divs = getElementsByClassName(document,"status_sort"); 
    divs.sort(compare); 

    for (var i = 0; i < divs.length; i++) 
    { 
    $("#contact_info").append(divs[i]); 
    } 
} 

function compare(div1, div2) 
{ 
    var id1 = div1.getAttribute("id"); 
    var id2 = div2.getAttribute("id"); 
    if (id1 > id2) 
    return 1; 
    else if (id1 < id2) 
    return -1; 
    else 
    return 0; 
} 

任何想法或可能的解決?謝謝。

更新

我試圖MrBuuBuu解決方案,它的工作原理patially,因爲現在的排序狀態的作品,但字母排序不能正常工作。我必須改變MrBuuBuu解決方案的一部分,比較功能,因爲我比較聯繫人的姓名和代表狀態的姓名之前的號碼(例如約翰,2表示離線,1表示在線),所以我必須比較與'<'和'>'並返回1,-1或0.

但最糟糕的是,現在它不適用於IE7或IE8 ...按狀態排序不起作用。

真的很奇怪,有什麼想法嗎?

回答

2

document.getElementsByClassName返回一個節點列表,而不是陣列。所以你必須先將它轉換爲數組。我還清理了你的compare()函數。

function compare(div1, div2) 
{ 
    var id1 = div1.id; 
    var id2 = div2.id; 

    if (id1 < id2) { 
     return - 1; 
    } 
    if (id1 == id2) { 
     return 0; 
    } 
    return 1; 
} 

function sortByStatus() 
{ 

    var divs  = document.getElementsByClassName("status_sort"); 
    var divArray = $.map(divs, function(div) { return div; }); 

    divArray.sort(compare); 

    $.each(divArray, function(i, div){ 
     $("#contact_info").append(div);  
    }); 
} 
+0

我想我的問題是id1 - id2,因爲他們的內容,例如,2John和1Peter,所以結果是NaN。我需要弄清楚如何解決這個問題,只取數字。謝謝。 – Datenshi 2011-03-25 04:32:31

+0

試試這個版本。這應該工作。 – JWC 2011-03-25 14:31:52

0

你確定它一直在工作嗎?在全球範圍內,沒有像getElementsByClassName這樣的功能。使用document.getElementsByClassName("status_sort")代替。

+0

有一次,getElementsByClassName不是原生的DOM函數,所以它有各種版本。我懷疑是這種情況,因爲他的函數將'document'對象作爲參數。但是你的建議很好。 – 2011-03-25 03:51:13

+0

是的,用IE7和8測試並工作。我試過你的解決方案沒有運氣,謝謝。 ;) – Datenshi 2011-03-25 03:54:40

1

如果您使用瀏覽器的原生getElementsByClassName函數,您可能會得到一個不是可排序數組的DOM節點集合。

當你說它不工作,你是否得到任何錯誤,或者它只是該數組不被排序?我假設你得到一個錯誤,因爲sort未定義。

有一兩件事你可以嘗試是在排序前克隆節點集合到一個普通的JavaScript數組:

divs = [].slice.call(divs); 
divs.sort(... 

我沒有IE9測試這個,但Chrome瀏覽器:

// undefined 
document.getElementsByClassName("someclass").sort 

但:

// the sort function 
[].slice.call(document.getElementsByClassName("someclass")).sort 
+0

或者如果你不想實例化一個數組,Array.prototype.slice.call(divs); – 2011-03-25 03:48:58

+0

@Matt:你說的對,但是這種優化的額外冗長通常是不值得的。 – 2011-03-25 03:51:24

+0

沒有錯誤,只是數組沒有排序。排序功能從來沒有達到(測試其中的一些警報)。我會嘗試你的解決方案。謝謝 – Datenshi 2011-03-25 03:53:41