3

理由はわかりませんが、このコードは私のliを適切にソートしていません。順番が入れ替わっていますが、例えば 1, 5, 2, 9 だったら 5, 2, 9, 1 と変わっています。

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>
4

2 に答える 2

1

-1ソートコールバックから戻らないためかもしれません。常に1または0、どちらのところで、あなたも正しく戻っていません。

昇順で並べ替える場合は、より小さい-1場合は(負の数)、等しい場合は(正の数)、より大きい場合は(正の数)を返す必要があります。keyAkeyB0+1keyAkeyB

例:

$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ドキュメントを読んで、ソートコールバックの詳細をご覧ください。

于 2013-02-08T17:03:11.647 に答える
0

Felix Kling が指摘しているように、あなたのソート機能は完璧ではありません。これらは、MDN のドキュメントから、有効な並べ替えが対処しなければならない条件です。

  • compareFunction(a, b)が 0 未満の場合、a を b よりも低いインデックスに並べ替えます。
  • 0 を返す場合compareFunction(a, b)、a と b は互いに変更されませんが、すべての異なる要素に関してソートされます。注: ECMAscript 標準はこの動作を保証していないため、すべてのブラウザー (たとえば、少なくとも 2003 年までさかのぼる Mozilla バージョン) がこれを尊重しているわけではありません。
  • compareFunction(a, b)が 0 より大きい場合、b を a よりも小さいインデックスに並べ替えます。
  • compareFunction(a, b)要素 a と b の特定のペアを 2 つの引数として指定すると、常に同じ値を返す必要があります。一貫性のない結果が返された場合、ソート順は未定義です

彼はすでに動作するソート関数を投稿しています (そして、私のドキュメントへのリンクを 1'uped) ので、将来これを実装する手間を省くための jQuery UI プラグインを紹介します: jQuery UI Sortable

于 2013-02-08T17:06:52.670 に答える