【问题标题】:jQuery UI Datepicker - Date range - Highlight days in betweenjQuery UI Datepicker - 日期范围 - 突出显示之间的天数
【发布时间】:2011-12-11 12:05:19
【问题描述】:

我正在寻找一种方法来在鼠标悬停时突出显示 2 个输入的日期范围之间的日期

这个例子几乎完成了我想要实现的目标: http://hackingon.net/files/jquery_datepicker/range.htm

唯一的区别是所选范围的突出显示应该发生在两个单独的日期选择器和鼠标悬停时。

有什么建议吗?


更新:

好的,再详细一点:

从第一个日期选择器中选择一个日期后,第二个日期选择器应该突出显示之前选择的日期。如果您随后将鼠标悬停在前一个选定日期之后的一天上,则其间的所有天都应通过添加一个类来突出显示。


更新: 这是我走了多远:

    $("#input-service_date_leave, #input-service_date_return").datepicker({
        rangeSelect: true,
        beforeShow: customRange,
        onSelect: customRange,
    });

    function customRange(input) {
        if (input.id == "input-service_date_leave") {

            $("#ui-datepicker-div td").die();

            if (selectedDate != null) { 
                $('#input-service_date_return').datepicker('option', 'minDate', selectedDate).datepicker('refresh');
            }
        }
        if (input.id == "input-service_date_return") {

            $("#ui-datepicker-div td").live({
                mouseenter: function() {
                    $(this).prevAll("td:not(.ui-datepicker-unselectable)").addClass("highlight");
                },
                mouseleave: function() {
                    $("#ui-datepicker-div td").removeClass("highlight");
                }
            });

            var selectedDate = $("#input-service_date_leave").datepicker("getDate");                
            if (selectedDate != null) { 
                $('#input-service_date_return').datepicker('option', 'minDate', selectedDate).datepicker('refresh');
            }
        }
    }

http://jsfiddle.net/mayko/WbWg3/1/

唯一的问题,实时事件只是突出显示当前悬停行的 td,而不是之前行的 td。

有什么想法吗?

【问题讨论】:

    标签: jquery jquery-ui datepicker highlighting date-range


    【解决方案1】:

    我在您的脚本中添加了一些内容。在JSFiddle 上工作就像一个魅力。看看,让我知道。

        $("#input-service_date_leave, #input-service_date_return").datepicker({
            rangeSelect: true,
            beforeShow: customRange,
            onSelect: customRange,
        });
    
        function customRange(input) {
            if (input.id == "input-service_date_leave") {
    
                $("#ui-datepicker-div td").die();
    
                if (selectedDate != null) {
                    $('#input-service_date_return').datepicker('option', 'minDate', selectedDate).datepicker('refresh');
                }
            }
            if (input.id == "input-service_date_return") {
    
                $("#ui-datepicker-div td").live({
                    mouseenter: function() {
                        $(this).parent().addClass("finalRow");
                        $(".finalRow").prevAll().find("td:not(.ui-datepicker-unselectable)").addClass("highlight");
                        $(this).prevAll("td:not(.ui-datepicker-unselectable)").addClass("highlight");
                   },
                    mouseleave: function() {
                        $(this).parent().removeClass("finalRow");
                        $("#ui-datepicker-div td").removeClass("highlight");
                    }
                });
    
                var selectedDate = $("#input-service_date_leave").datepicker("getDate");                
                if (selectedDate != null) {
                    $('#input-service_date_return').datepicker('option', 'minDate', selectedDate).datepicker('refresh');
                }
            }
        }
    

    【讨论】:

    • 这个答案对我有帮助!非常感谢!
    • 还有一件事,你能帮忙更新一下,让它跨越到下个月吗?我在选择器中展示了两个月。谢谢!
    • @Marvzz 我添加了一个答案,其中包含一个脚本可以用多个月来完成
    【解决方案2】:

    编辑:此脚本不适用于 jquery 3。但它适用于版本 1 和 2

    this JSFiddle 是使用 2 个日期表(多个月)的示例

    $("#input-service_date_leave, #input-service_date_return").datepicker({
        rangeSelect: true,
        beforeShow: customRange,
        onSelect: customRange,
        numberOfMonths: [1, 2],
    });
    
    function customRange(input) {
        if (input.id == "input-service_date_leave") {
    
            $("#ui-datepicker-div td").die();
    
            if (selectedDate != null) {
                $('#input-service_date_return').datepicker('option', 'minDate', selectedDate).datepicker('refresh');
            }
        }
        if (input.id == "input-service_date_return") {
    
            $("#ui-datepicker-div td").live({
                mouseenter: function() {
                    $(this).parent().addClass("finalRow");
                    $(".finalRow").parents('.ui-datepicker-group-last').parent().find('.ui-datepicker-group-first').find('tr').last().addClass("finalRowRangeOtherTable");
                    $(".finalRowRangeOtherTable").find("td:not(.ui-datepicker-unselectable)").addClass("highlight");
                    $(".finalRowRangeOtherTable").prevAll().find("td:not(.ui-datepicker-unselectable)").addClass("highlight");
    
                    $(".finalRow").prevAll().find("td:not(.ui-datepicker-unselectable)").addClass("highlight");
                    $(this).prevAll("td:not(.ui-datepicker-unselectable)").addClass("highlight");
               },
                mouseleave: function() {
                    $(this).parent().removeClass("finalRow");
                    $("#ui-datepicker-div td").removeClass("highlight");
    
                      $(".finalRowRange").removeClass("finalRowRange").find('.highlight').removeClass("highlight");
                $(".finalRowRangeOtherTable").removeClass("finalRowRangeOtherTable").find('.highlight').removeClass("highlight");
    
                }
            });
    
            var selectedDate = $("#input-service_date_leave").datepicker("getDate");                
            if (selectedDate != null) {
                $('#input-service_date_return').datepicker('option', 'minDate', selectedDate).datepicker('refresh');
            }
        }
    }
    

    【讨论】:

    • 请有人将它迁移到 jQuery 3。
    • @AbhishekSaini 应该在 jquery 3 上运行,但未经测试。 jq3 中弃用了这里的哪些功能?
    • 不,不起作用。 live() & die() 不在 jQuery 3 中。
    【解决方案3】:

    在此处为内联日期选择器制作了日期范围悬停示例: http://codepen.io/denissamoilov/pen/RGKyPb?editors=0010

    $(function(){
        var datepicker = {
            container: $("#datepicker"),
            dateFormat: 'mm/dd/yy',
            dates: [null, null],
            status: null,
            inputs: {
                checkin: $('#checkin'),
                checkout: $('#checkout'),
                dates: $('#dates')
            }
        };
    
        datepicker.container.datepicker({
            numberOfMonths: 2,
            dateFormat: datepicker.dateFormat,
            minDate: 0,
            maxDate: null,
    
            beforeShowDay: function(date) {
                var highlight = false,
                currentTime = date.getTime(),
                selectedTime = datepicker.dates;
    
                // Highlight date range
                if ((selectedTime[0] && selectedTime[0] == currentTime) || (selectedTime[1] && (currentTime >= selectedTime[0] && currentTime <= selectedTime[1]))) highlight = true;
    
                return [true, highlight ? 'ui-datepicker-select' : ""];
            },
            onSelect: function(dateText) {
    
                if (!datepicker.dates[0] || datepicker.dates[1] !== null) {
                    // CHOOSE FIRST DATE
    
                    // fill dates array with first chosen date
                    datepicker.dates[0] = $.datepicker.parseDate(datepicker.dateFormat, dateText).getTime();
                    datepicker.dates[1] = null;
    
                    // clear all inputs
                    datepicker.inputs.checkin.val('');
                    datepicker.inputs.checkout.val('');
                    datepicker.inputs.dates.val('');
    
                    // set current datepicker state
                    datepicker.status = 'checkin-selected';
    
                    // create mouseover for table cell
                    $('#datepicker').delegate('.ui-datepicker td', 'mouseover', function(){
    
                        // if it doesn't have year data (old month or unselectable date)
                        if ($(this).data('year') == undefined) return;
    
                        // datepicker state is not in date range select, depart date wasn't chosen, or return date already chosen then exit
                        if (datepicker.status != 'checkin-selected') return;
    
                        // get date from hovered cell
                        var hoverDate = $(this).data('year')+'-'+($(this).data('month')+1)+'-'+$('a',this).html();
    
                        // parse hovered date into milliseconds
                        hoverDate = $.datepicker.parseDate('yy-mm-dd', hoverDate).getTime();
    
                        $('#datepicker td').each(function(){
    
                            // compare each table cell if it's date is in date range between selected date and hovered
                            if ($(this).data('year') == undefined) return;
    
                            var year = $(this).data('year'),
                                month = $(this).data('month'),
                                day = $('a', this).html();
    
                            var cellDate = $(this).data('year')+'-'+($(this).data('month')+1)+'-'+$('a',this).html();
    
                            // convert cell date into milliseconds for further comparison
                            cellDate = $.datepicker.parseDate('yy-mm-dd', cellDate).getTime();
    
                            if ( (cellDate >= datepicker.dates[0] && cellDate <= hoverDate) || (cellDate <= datepicker.dates[0] && cellDate >= hoverDate) ) {
                                $(this).addClass('ui-datepicker-hover');
                            } else {
                                $(this).removeClass('ui-datepicker-hover');
                            }
    
                        });
                    });
    
                } else {
                    // CHOOSE SECOND DATE
    
                    // push second date into dates array
                    datepicker.dates[1] = $.datepicker.parseDate(datepicker.dateFormat, dateText).getTime();
    
                    // sort array dates
                    datepicker.dates.sort();
    
                    var checkInDate = $.datepicker.parseDate('@', datepicker.dates[0]);
                    var checkOutDate = $.datepicker.parseDate('@', datepicker.dates[1]);
    
                    datepicker.status = 'checkout-selected';
    
                    //fill input fields
    
                    datepicker.inputs.checkin.val($.datepicker.formatDate(datepicker.dateFormat, checkInDate));
                    datepicker.inputs.checkout.val($.datepicker.formatDate(datepicker.dateFormat, checkOutDate)).change();
    
                    datepicker.inputs.dates.val(datepicker.inputs.checkin.val() + ' - ' + datepicker.inputs.checkout.val());
    
                }
            }
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 2012-03-24
      • 2013-01-17
      • 1970-01-01
      • 2012-08-08
      相关资源
      最近更新 更多