无法在jQuery中对日期进行排序

时间:2012-11-07 23:50:49

标签: jquery

我一直在尝试按jQuery中的升序/降序排序我的日期,但没有运气。什么出错了?这是我的代码:http://jsfiddle.net/UdwNh/

 var itemsArray = $('div#activity_box');
    itemsArray.sort(function(a,b){
        var aTime = new Date($(a).find('#activity_date').text()).getTime();
        var bTime = new Date($(b).find('#activity_date').text()).getTime();
        return aTime - bTime;
    });

    $('#sortAsc').click(function(){
        $("#wrapper").empty();
        $(itemsArray).each(function(){
            $("#wrapper").prepend($(this));
        });
    });

    $('#sortDesc').click(function(){
        $("#wrapper").empty();
        $(itemsArray).each(function(){
            $("#wrapper").append($(this));
        });
    });​

相关HTML:

<input class="btn" type="button" value="Sort Ascending" id="sortAsc"/>
<input class="btn" type="button" value="Sort Descending" id="sortDesc"/>

<div id="wrapper">
    <ul>
    <li class='item'><div id='activity_date'>01/10/2012</div>
    <div id='activity_box'>
    <div id='activity_text' class='windowClass2'>...text here...</div>
    </div></li><li class='item'><div id='activity_date'>04/10/2012</div>
    <div id='activity_box'>
    <div id='activity_text' class='windowClass2'>...text here...</div>
    </div></li><li class='item'><div id='activity_date'>10/10/2012</div>
    <div id='activity_box'>
    <div id='activity_text' class='windowClass2'>...text here...</div>
    </div></li><li class='item'><div id='activity_date'>16/10/2012</div>
    <div id='activity_box'>
    <div id='activity_text' class='windowClass2'>...text here...</div>
    </div></li>
    </ul>
</div>

1 个答案:

答案 0 :(得分:2)

该代码存在几个问题。

  1. 您在多个元素上使用相同的id值。 id values must be unique on the page

    要修复它,请使用类值,或data-* attribute,或允许在页面上多次出现的任何其他内容。

  2. 您正在jQuery实例上调用sort。 jQuery has no documented sort function。它可能有一个没有文档的,但如果是这样,你根本不知道它做了什么。假设它会重新排列DOM元素,这当然没有意义。

    要修复它,你必须为此编写自己的函数(它并不复杂),或找到一个为你做的插件。

  3. 即使sort确实有效,您传入new Date(string)的日期字符串的格式为20/10/201217/10/2012等。这不是new Date(string)要记录的格式。唯一的字符串格式new Date(string) is documented to understandISO-8601的简化形式,看起来不像那样。事实上,new Date("20/10/2012")在Chrome和其他浏览器上都失败了。

    要修复它,您需要以另一种方式获取日期。您可以将元素上的毫秒 - 自上帝值存储为data-* attribute,然后直接使用它。或者你可以解析你自己的日期字符串。如果它们始终采用dd/mm/yyyy格式,则将各个部分解析为数字是微不足道的,然后您可以将年,月和日的结果数传递给new Date(year, month, date)。 (请记住,月份以0 = 1月开头。)

  4. 您在开始时关闭</li>,其中没有开放<li>

    要解决此问题,请不要这样做。 : - )