0

ここstackoverflowの親切な人のおかげで、このコードがありますが、期待どおりに完全には機能しません. 問題は、現在日付の正確な一致をチェックしていることですが、時間が互いに重なって競合も表示される場合があります (競合の場合は背景が赤くなります)。ご覧のとおり、次の日付 "Wednesday Oct/30 11:00 AM - 3:15 PM" は、Wednesday Oct/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) から日付データを抽出し、時間の重複があるかどうかを確認する必要があると考えています。基本的に、スクリプトはいくらか改良する必要があり、完全に機能します。誰かがここで私を助けることができれば、私はとても感謝しています. 前もって感謝します。

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 に答える