2011-03-25 72 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

相关问题