Javascript排序不适用于IE9?

时间:2011-03-25 03:28:35

标签: javascript jquery

问题是我有一个联系人列表,当有人改变他/她的状态时,我会尝试将它们移到列表的顶部。到目前为止,一切都工作,使用IE9,Firefox 4无效。我给你看了代码:

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解决方案并且它的工作方式很有用,因为现在按状态排序有效但字母排序无法正常工作。我不得不改变MrBuuBuu解决方案的部分比较功能,因为我将联系人的姓名与代表状态的名称之前的数字进行比较(例如2John,2表示离线,1表示在线)所以我必须比较与'&lt;'和'&gt;'并返回1,-1或0。

但最糟糕的是,现在它不适用于IE7或IE8 ......按状态排序无效。

真的很奇怪,任何想法?

3 个答案:

答案 0 :(得分:2)

document.getElementsByClassName返回NodeList,而不是数组。所以你必须先将它转换为数组。我还清理了你的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);     
  });
}

答案 1 :(得分: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

答案 2 :(得分:0)

你确定它一直在运作吗?全局范围内没有getElementsByClassName这样的功能。

请尝试使用document.getElementsByClassName("status_sort")