【问题标题】:Javascript sort not working with IE9?Javascript 排序不适用于 IE9?
【发布时间】:2011-03-25 03:28:34
【问题描述】:

问题是我有一个联系人列表,当有人更改他/她的状态时,我会尝试将他们移到列表顶部。到目前为止一切正常,使用 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 表示在线)所以我必须进行比较使用 '' 并返回 1、-1 或 0。

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

真的很奇怪,有什么想法吗?

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    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);     
      });
    }
    

    【讨论】:

    • 我认为我的问题是 id1 - id2,因为它们满足例如 2John 和 1Peter,所以结果是 NaN。我需要弄清楚如何解决这个问题,只取数字。谢谢。
    【解决方案2】:

    如果您使用浏览器的原生 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
    

    【讨论】:

    • 或者如果你不想实例化一个数组,Array.prototype.slice.call(divs);
    • @Matt:你是对的,但这种优化的额外冗长通常是不值得的。
    • 没有错误,只是数组没有排序。永远无法达到排序功能(在其中测试了一些警报)。我会尝试你的解决方案。谢谢
    • 我的意思是永远无法达到比较功能。
    【解决方案3】:

    你确定它一直在工作吗?全局范围内没有getElementsByClassName这样的函数。

    尝试改用document.getElementsByClassName("status_sort")

    【讨论】:

    • 曾经,getElementsByClassName 不是一个原生的 DOM 函数,所以它有各种版本。我怀疑这里就是这种情况,因为他的函数将document 对象作为参数。但你的建议很好。
    • 是的,在 IE7 和 8 上进行了测试,并且可以正常工作。我尝试了您的解决方案,但没有成功,无论如何,谢谢。 ;)
    猜你喜欢
    • 2011-10-15
    • 2014-11-17
    • 1970-01-01
    • 2013-07-30
    • 2012-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    相关资源
    最近更新 更多