0

我们有这段代码,感谢 stackoverflow 的一位乐于助人的人,但它并没有按预期完全工作。问题是它目前检查日期的精确匹配,但有些时间相互重叠并且也应该显示冲突(如果发生冲突,背景会变为红色)。如您所见,以下日期“10 月 30 日星期三 11:00 AM - 3:15 PM”与 10 月 30 日星期三 10:00 AM - 12:15 PM 重叠。显然,一个人不可能同时在不同的位置。

使用的代码是这样的:

$(".time").change(function() {
        var values = $("input.time").map(function(){
            return $(this).val();
        });
        values.each( function (){
            var overlapping = $("input.time[value='"+ this +"']");
            if (overlapping.filter(":checked").length > 1){                            
                overlapping.parents("tr").addClass("red");}
            else{
                overlapping.parents("tr").removeClass("red");
            }
        })
    });

小提琴在这里:http: //jsfiddle.net/3VFRt/

我知道需要做什么,但我似乎无法理解在 jQuery 中是如何完成的。我认为它需要从列(td's)中提取日期数据,看看是否有时间重叠,如果有,则相应地显示(css class=red)。基本上脚本需要一些改进,它会完美地工作。如果有人可以在这里帮助我,我将不胜感激。提前致谢。

4

1 回答 1

1

是的,您需要手动提取日期并进行比较。这是一个小提琴。另请参阅有关比较重叠日期的 SO帖子。

$(".time").change(function() {    
    removeErrors();
    var dateOverlapping = $("input.time:checked").filter(function() {
        return $("input.time[value^='"+ $(this).val().split('|')[0] +"']:checked").length > 1;
    });
    dateOverlapping.each(function(i, elem){
        var timeOverlapping = dateOverlapping.filter(function(i2, elem2) {
            return i != i2 && overlaps(range($(elem).val().split('|')[1]), 
                                       range($(elem2).val().split('|')[1]));
        });
        if(timeOverlapping.length > 0)
            $(elem).parents("tr").addClass('red');
        else
            $(elem).parents("tr").removeClass('red');
    });
});

function removeErrors() {
    $("input.time").each(function() {
        $(this).parents("tr").removeClass('red');
    });
}

function overlaps(range1, range2) {
    return (range1.start <= range2.end) && (range2.start <= range1.end);
}

function range(time) {
    var tms = time.split('-');
    return {
        start : timeToFloat(tms[0]),
        end : timeToFloat(tms[1])
    };
}

function timeToFloat(time)
{
    var toks = time.trim().split(/\s+/);
    var num = toks[0].trim().split(':');
    var val = parseFloat(num[0]) + 0.01 * parseFloat(num[1]);
    if(Math.floor(val) == 12)
    {
        if(toks[1].toLowerCase() == "am")
            val -= 12;
    }
    else if(toks[1].toLowerCase() == "pm")
        val += 12;
    return val;
}
于 2013-09-15T11:57:22.707 回答