1

我正在尝试做一个客户端类型的 jQuery UI 手风琴,按标题文本按字母顺序放置手风琴部分。

jQuery UI 结构由一个用于类别标题的 h3 和一个用于该类别内容的 div 组成。因此,我需要对 h3 文本进行排序,但要在 DOM 中串联移动每个 h3 及其以下 div。

我有以下可在 FF 和 Chrome 中使用的功能,但不适用于任何 IE 风格:

function sort_accordion_headers() {
    var tempArray = [];
    //Push h3-div pairs into array
    $('.accordion h3').each(function(i,ui) {
        tempArray.push(new accordion_sort_object(ui,$(ui).next('div')));
    });
    //Sort the array on header text
    tempArray.sort(function(a,b) {
                var keyA = $(a.header).text();
                var keyB = $(b.header).text();
                return (keyA > keyB) ? 1 : 0;   
    });
    //Clear accordion contents and replace with re-sorted content
    for (var i in tempArray) {
        $('.accordion').append(tempArray[i].header).append(tempArray[i].div); 
    }
}

//Creates custom object for sorting accordion headers
function accordion_sort_object($htag,$div) {
    this.header = $htag;
    this.div = $div;
}

知道为什么这在 IE 中不起作用吗?感觉它必须与 append() 或 sort() 函数有关,但我不确定是什么。

编辑:澄清一下,它不会在 IE 中引发错误;它只是不执行排序。手风琴部分保持原来的顺序。

编辑:问题解决了!感谢 Plalx 指出当 KeyA 小于 KeyB 时我返回 0,而我应该返回 -1。

4

1 回答 1

2

sort 方法对 Array 对象进行就地排序;执行期间不会创建新的 Array 对象。如果您在 sortFunction 参数中提供函数,它必须返回以下值之一:

  • 如果传递的第一个参数小于第二个参数,则为负值。
  • 如果两个参数相等,则为零。
  • 如果第一个参数大于第二个参数,则为正值。

取自http://msdn.microsoft.com/en-us/library/ie/4b4fbfhk(v=vs.94).aspx

['b', 'a'].sort(function (a, b) { return a > b? 1 : (b > a? -1 : 0) }); //a, b
于 2013-05-09T02:31:21.763 回答