【问题标题】:Jquery UI Calendar - how to highlight days after the current date?Jquery UI Calendar - 如何突出显示当前日期之后的天数?
【发布时间】:2014-04-11 01:30:06
【问题描述】:

我正在为客户开发一个网站,在我使用 Jquery UI Calendar 的网站上,我需要能够突出显示当前日期后 2 天开始的 3 个工作日,但要结合数学来计算周末。这是我的小提琴:

JS Fiddle

这里是 HTML

<input type="text" id='datepicker'>

这里是 JS

var SelectedDates = {};
SelectedDates[new Date('04/14/2014')] = new Date('04/14/2014');
SelectedDates[new Date('04/15/2014')] = new Date('04/15/2014');
SelectedDates[new Date('04/16/2014')] = new Date('04/16/2014');

$('#datepicker').datepicker({
    minDate: 2,
    maxDate: "+4M +15D",
    beforeShowDay: function (date) {
        var Highlight = SelectedDates[date];
        if (Highlight) {
            return [true, "Highlighted", Highlight];
        } else {
            return [true, '', ''];
        }
    }
});

我无法将beforeShowDay: $.datepicker.noWeekends 添加到上面的代码中。我还需要突出显示的 3 个日期是可变的,因此它们会根据当前日期而变化,但我仍在学习 JS,我不明白其背后的逻辑。

我浏览了这个网站和其他网站,虽然有很多关于如何突出显示特定日期的问题/答案,但没有一个完全适用于我正在尝试做的事情。

所以为了澄清一下,我需要做数学来弄清楚如何否定 minDate 和周末并突出显示接下来的三个工作日。

【问题讨论】:

  • 为什么 minDate 设置为 2?这会阻止某人选择明天。
  • 因为他们选择的日期是发货日期,而minDate: 2基本上就是处理时间
  • 那么您想像小提琴一样突出显示星期五、星期一和星期二(今天是星期四)还是星期一、星期二和星期三?您的问题是“当前日期后 3 个工作日”,但这与小提琴示例不符。
  • 你能看看jsfiddle.net/j08691/mw5fZ/5,告诉我这是否接近你想要的?
  • 这个jsfiddle.net/j08691/mw5fZ/6怎么样?您可以通过更改today = new Date(); 行来测试它与其他日期。例如,4 月 20 日将是 today = new Date(2014,3,20);(月份从零开始)。让我知道这是否是您需要的,如果需要,我会将其发布为答案。

标签: javascript jquery html jquery-ui


【解决方案1】:

应该这样做:

jsFiddle example

$(document).ready(function () {
    var css, count = 0,
        gap = 0,
        today = new Date();
    $('#datepicker').datepicker({
        showOtherMonths: true,
        selectOtherMonths: true,
        minDate: 2,
        maxDate: "+4M +15D",
        beforeShowDay: function (date) {
            var day = date.getDay();
            var diff = new Date(date - today);
            var numDays = Math.ceil(diff / 1000 / 60 / 60 / 24);
            if (numDays > 0 && count < 3) {
                if (day != 6 && day != 0) {
                    gap++;
                    if (gap > 1) {
                        count++;
                        css = 'Highlighted';
                    } else css = '';
                }
            } else css = '';
            return [(day != 6) && (day != 0), css]; //0-Sunday 6-Saturday
        },
        onSelect: function () {
            count = 0;
            gap = 0;
        }
    });
});

【讨论】:

    【解决方案2】:

    更新

    这是一种方法:

    var currentDay = new Date();
        var dayOfWeek;
        var highlighted = 0;
        var count = 0;
        var SelectedDates = {};
    
        while(highlighted < 3){
           dayOfWeek = currentDay.getDay();
            if(dayOfWeek != 0 && dayOfWeek != 6){
                if(count > 1){
                    alert(currentDay);
                    var month = currentDay.getMonth()+1;
                    if(month.toString().length < 2)
                        month = '0'+month;
                    var day = currentDay.getDate();
                    if(day.toString().length < 2)
                        day = '0'+day;
                    var year = currentDay.getFullYear();
                    var dateStr = month+"/"+day+"/"+year;   
                    SelectedDates[new Date(dateStr)] = new Date(dateStr);
                    highlighted++;
                }
                else {
                    count++;    
                }
            }
            currentDay = new Date(currentDay.getTime() + (24 * 60 * 60 * 1000));    
        }
    

    例子:

    FIDDLE

    【讨论】:

    • 我刚刚意识到,如果不是周末,您可能也想将今天算作工作日。我会更新我的帖子。
    • @MatthewSechrest 检查我的更新。无论是哪一天,它都会为您工作。
    • 好的,这很好用!那么如果当天是星期三,那么突出显示的日期会是星期五、星期一和星期二吗?
    • @MatthewSechrest 是的,看一下这个模拟示例jsfiddle.net/trevordowdle/XYY67/2,但是请注意,您的代码行 minDate:2 已被注释掉。取消注释该行,看看会发生什么。
    • 无论如何,当您取消注释时,该行 friday 是灰色的,但这仅仅是因为今天真的是星期四。但如果它真的是星期三,那么它不会变灰。所以不用担心。
    猜你喜欢
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多