2013-02-08 68 views
3

我不知道为什么,但这段代码没有正确排序我的李。他们正在改变顺序,但是例如,如果它们是这样的1,5,2,9然后将其改变到5,2,9,1。jQuery - 排序李

jQuery代码:

var sorter_type=new Array("date_sort","price_sort","discount_sort","time_sort"); 
function sorting_by_filter(filter_id,field) 
{ 
    var sort_type=""; 

    if($('#'+filter_id).attr("class")=="asc") 
    { 
     $('#'+filter_id).removeClass("asc"); 
     $('#'+filter_id).addClass("desc"); 
     sort_type=" desending"; 
    } 
    else 
    { 
     $('#'+filter_id).removeClass("desc"); 
     $('#'+filter_id).addClass("asc"); 
     sort_type=""; 
    } 

    for(i=0;i<sorter_type.length;i++) 
    { 
     if(sorter_type[i]==filter_id) 
     { 
      $('#'+filter_id).parent().attr("class",""); 
      $('#'+filter_id).parent().addClass("clsTop_Menu_Act"+sort_type); 
     } 
     else 
     { 
      $("#"+sorter_type[i]).parent().attr("class",""); 
     } 

    } 

    var $sort = $('#'+filter_id); 

    var $list = $('.clsDeal_Whole_Cont'); 
    var $listLi = $('li.clsDeal_Blk_Cont',$list); 
    $listLi.sort(function(a, b){ 
     var keyA = parseInt($(a).attr(field)); 
     var keyB = parseInt($(b).attr(field)); 
     if($($sort).hasClass('asc')){ 
      return (keyA > keyB) ? 1 : 0; 
     } else { 
      return (keyA < keyB) ? 1 : 0; 
     } 
    }); 
    $.each($listLi, function(index, row){ 
     $list.append(row); 
    }); 
} 

按钮的代码:这就需要

 <ul class="clearfix" id="filters"> 
     <li class="clsTop_Menu_Act"><a href="javascript:void(0)" class="asc"  onclick="sorting_by_filter('date_sort','title')" id="date_sort">New</a></li> 
      <li><a href="javascript:void(0)" onclick="sorting_by_filter('price_sort','price')" class="asc" id="price_sort">Price</a></li> 
      <li><a href="javascript:void(0)" onclick="sorting_by_filter('discount_sort','discount')" class="asc" id="discount_sort">Discount</a></li> 
      <li><a href="javascript:void(0)" onclick="sorting_by_filter('time_sort','time_left')" class="asc" id="time_sort" >Time Left</a></li> 
</ul> 

内容进行排序:

<ul class="clsDeal_Whole_Cont clearfix"> 
    <li class="clsDeal_Blk_Cont" style="display:block" id="deal_1" price="2" discount="50" time_left="1360363800"> 
    <li class="clsDeal_Blk_Cont" style="display:block" id="deal_10" price="20" discount="45" time_left="1360363700"> 
    <li class="clsDeal_Blk_Cont" style="display:block" id="deal_5" price="19" discount="80" time_left="1360363800"> 
</ul> 
+0

它看起来不像你的代码只做一些排序。你应该把它分成更小的功能来完成特定的工作。要更清楚 – 2013-02-08 17:02:54

回答

1

也许因为你永远不返回-1从你的排序回调。总是只有10,顺便说一句,你没有正确返回。

如果您在上升顺序排序,那么你必须返回-1(负数),如果keyA小于keyB0如果它们相等或+1(正数),如果keyAkeyB大。

例子:

$listLi.sort(function(a, b){ 
    var keyA = parseInt($(a).attr(field), 10); 
    var keyB = parseInt($(b).attr(field), 10); 

    // sorts in descending order. The result will be 
    // negative if keyA > keyB 
    // 0  if keyA == keyB 
    // positive if keyA < keyB 

    var result = keyB - keyA; 
    if ($sort.hasClass('asc') { 
     // multiplying by -1 reverses the order 
     result = result * (-1); 
    } 
    return result; 
}); 

通过阅读Array#sort documentation了解更多关于排序回调。

+0

不幸的是,这也不工作,李的仍然是随机的顺序。无论如何,感谢您的链接。 – Marek 2013-02-08 17:10:33

0

正如Felix Kling指出的那样,您的排序功能还没有达到要求。这些都是有效的种类必须处理的条件下,从MDN documentation

  • 如果compareFunction(a, b)小于0,排序一个比B A较低折射率。
  • 如果compareFunction(a, b)返回0,则相对于彼此保持a和b不变,但相对于所有不同的元素进行排序。注意:ECMAscript标准并不保证这种行为,因此并非所有浏览器(例如,至少可以追溯到2003年的Mozilla版本)都尊重这一点。
  • 如果compareFunction(a, b)大于0,则将b排序为比a更低的索引。
  • compareFunction(a, b)当给定一对特定元素a和b作为其两个参数时,必须始终返回相同的值。如果不一致的结果返回则排序顺序是未定义

他已经张贴了工作排序功能(和1'uped我的文档链接),所以我就点你到一个jQuery UI插件录取工作出于未来的实施:jQuery UI Sortable