将div元素与日期进行比较并将它们移动到另一个div中

时间:2012-10-27 08:04:00

标签: jquery

我有一个div元素( #receivedInfo ),其中包含p个元素。每个p元素都有一个日期。我设法从每个元素中取出这个日期并将其与当前日期进行比较 在将每个元素与当前日期进行比较后,我想将它们移动到两个div中:

  • 一个包含日期高于当前日期的所有元素(“ .licitatiiActive ”)
  • 另一个包含日期低于当前日期的所有元素(“ .licitatiiInactive ”)

我设法进行了比较,但我只能移动一个元素。

以下是我使用的HTML:

<div id="receivedInfo" class="hidden">
    <p>16.10.2012 - <a href="#">test line 1</a></p>
    <p>16.10.2012 - <a href="#">test line 2</a></p>
    <p>16.10.2012 - <a href="#">test line 3</a></p>
    <p>16.10.2012 - <a href="#">test line 4</a></p>
</div>
<div class="licitatiiActive"></div>
<div class="licitatiiInactive"></div> 

这是我使用的jQuery:

var fullDate = new Date();
var twoDigitMonth = (fullDate.getMonth()+1)+"";
if(twoDigitMonth.length==1) twoDigitMonth="0" +twoDigitMonth;
var twoDigitDate = fullDate.getDate()+"";
if(twoDigitDate.length==1)  twoDigitDate="0" +twoDigitDate;
var currentDate = twoDigitDate + "." + twoDigitMonth + "." + fullDate.getFullYear();

var dataLic;
var infoP;

$.each($("#receivedInfo p"), function () {
    var info = $(this).html();
    dataLic = info.split(' - ')[0].trim();
    infoP = "<p>" + info + "</p>";

});
if (dataLic > currentDate) {
        $(".licitatiiInactive").html(infoP);
    } else {
        $(".licitatiiActive").html(infoP);
    }

如上所述,结果是只有div“ #receivedInfo ”中的第一个p元素被移动到div“ .licitatiiInactive ”。 如何调整此脚本以将“ #receivedInfo ”的每个元素移动到正确的div?

3 个答案:

答案 0 :(得分:1)

问题是each循环的每次传递都会覆盖变量infoP,并且您不会在each完成之后移动html。

相反,您想要检查循环每次传递中的日期并附加新的html字符串。

编辑日期逻辑可以通过比较2个日期对象来简化和清理,如此代码所示

DEMO: http://jsfiddle.net/8ngA5/2/

var fullDate = new Date();

$("#receivedInfo p").each(function() {
    var info = $(this).html();
    var dataLic = $.trim(info.split(' - ')[0]).split('.');

    var d=new Date(parseInt( dataLic[2]), parseInt( dataLic[1]), parseInt( dataLic[0]))


    var infoP = "<p>" + info + "</p>";

    if (d < fullDate) {
        $(".licitatiiInactive").append(infoP);
    } else {
        $(".licitatiiActive").append(infoP);
    }

});

答案 1 :(得分:1)

按如下方式修改脚本:

    var fullDate = new Date();
    var twoDigitMonth = (fullDate.getMonth()+1)+"";
    if(twoDigitMonth.length==1) twoDigitMonth="0" +twoDigitMonth;
    var twoDigitDate = fullDate.getDate()+"";
    if(twoDigitDate.length==1)  twoDigitDate="0" +twoDigitDate;
    var currentDate = twoDigitDate + "." + twoDigitMonth + "." + fullDate.getFullYear();

    var dataLic;
    var infoP;

    $.each($("#receivedInfo p"), function () {
        var info = $(this).html();
        dataLic = info.split(' - ')[0].trim();
        infoP = "<p>" + info + "</p>";
        if (dataLic > currentDate) {
            $(".licitatiiInactive").append(infoP);
        } else {
            $(".licitatiiActive").append(infoP);
        }        
    });

答案 2 :(得分:1)

相关部分外部循环和相同的样本日期

自从我使用chrome dev tools进行调试并且console.log每次显示相同日期以来,我一开始感到惊讶。原因是每个样本日期都是相同的。

下面你可以看到一个有效的解决方案。 var dataLic在每个循环中填充,其当前值由appendDate处理。

$.each($("#receivedInfo p"), function () {              
    dataLic = $(this).html().split(' - ')[0].trim();                
    console.log("dataLic", dataLic, "currentDate", currentDate);        
    appendDate(dataLic, currentDate);
});

function appendDate(dataLic, currentDate){
    if (dataLic > currentDate) {
        $(".licitatiiInactive").append(dataLic +"<br/>");
    } else {
        $(".licitatiiActive").append(dataLic+"<br/>");
    }   
}

发现更新错误并在线示例

在我更改样本日期后找到错误非常简单。 您使用$.each循环每个日期,但复制值的代码在循环之外。如果你把你的代码(参见我的function appendDate())放在循环中,每个值都将被处理,而不仅仅是最后一个。 请查看working solution to copy the elements