jQuery UI Datepicker:如何在特定日期添加可点击事件?

Posted

技术标签:

【中文标题】jQuery UI Datepicker:如何在特定日期添加可点击事件?【英文标题】:jQuery UI Datepicker : how to add clickable events on particular dates? 【发布时间】:2011-07-31 11:58:49 【问题描述】:

我想在 jquery datepicker 上突出显示附加事件的日期(我说的不是 js 事件,而是现实生活中的事件:D)。

    如何将活动日期传递到日历? 如何使其可点击,或者在小弹出提示中显示事件及其 URL,或者转到事件页面?

请问是否有可用的插件或资源(如教程)来帮助我实现这一目标?

谢谢。

PS:我没有使用日期选择器来选择日期,只是为了访问附加到日期的事件

PS2:我将在多语言网站(法语和英语)上使用它,这就是我想到 datepicker 的原因

【问题讨论】:

我认为让事件可点击不是一个好主意。那你会如何选择那个日期呢? 还有,你是用这个来选日期的吗?如果没有,一些calendar plugin 可能更适合您。 @dancek 不,我没有用它来选择日期。只能访问事件。好的,谢谢,我去看看日历插件。 【参考方案1】:

这绝对是可能的,而且在我看来并没有过多地滥用 datepicker 小部件。有一个选项可以在线初始化小部件,它可以完全用于您上面描述的场景。

您必须采取几个步骤:

    在线初始化日期选择器。将 datepicker 小部件附加到 <div>,这样它就会始终出现,而您不必将它附加到 input

    $("div").datepicker(...);
    

    点击beforeShowDay 事件以突出显示特定事件的日期。此外,在一个数组中定义您的事件,您可以填充该数组并将其发送到客户端:

    事件数组:

    var events = [ 
         Title: "Five K for charity", Date: new Date("02/13/2011") , 
         Title: "Dinner", Date: new Date("02/25/2011") , 
         Title: "Meeting with manager", Date: new Date("03/01/2011") 
    ];
    

    事件处理程序:

    beforeShowDay: function(date) 
        var result = [true, '', null];
        var matching = $.grep(events, function(event) 
            return event.Date.valueOf() === date.valueOf();
        );
    
        if (matching.length) 
            result = [true, 'highlight', null];
        
        return result;
    ,
    

    这可能看起来有点复杂,但它所做的只是突出显示日期选择器中的日期,这些日期在上面定义的 events 数组中具有条目。

    定义一个onSelect 事件处理程序,您可以在其中告诉日期选择器在单击某一天时要执行的操作:

    onSelect: function(dateText) 
        var date,
            selectedDate = new Date(dateText),
            i = 0,
            event = null;
    
        /* Determine if the user clicked an event: */
        while (i < events.length && !event) 
            date = events[i].Date;
    
            if (selectedDate.valueOf() === date.valueOf()) 
                event = events[i];
            
            i++;
        
        if (event) 
            /* If the event is defined, perform some action here; show a tooltip, navigate to a URL, etc. */
            alert(event.Title);
        
    
    

    同样,它看起来有很多代码,但所发生的只是我们正在查找与点击日期相关联的事件。在我们找到该事件后,您可以采取任何您想要的操作(例如显示工具提示)

这是一个完整的工作示例:http://jsfiddle.net/Zrz9t/1151/。请务必导航到 2 月/3 月以查看活动。

【讨论】:

安德鲁,以上适用于格式如下的所有日期: mm/dd/yyyy ,有没有办法让它在 dd/mm/yyyy 中工作? 您是否尝试过使用dateFormat 选项? 好人!只是一个问题,如果一个日期有多个事件,我如何提醒? 感谢此代码!非常棒。起初它对我不起作用,然后我意识到最后一个 ); 有一个无效(不可见)字符; (或者它可能已经在我的页面上)。 ***.com/questions/9955242/… @KatiePatrick:你说得对,小提琴的代码末尾有一个不可见的字符。感谢您的提醒!【参考方案2】:

除了 Andrew Whitaker 解决方案之外,还有另一种方法(实际上它是一种 hack,但实际上它可能对其他人来说是完美的,因为标题或日期可能并不总是一个好的标识符)

注意:请先阅读Andrew Whitaker解决方案并在此处查看更改

// date picker
$("div").datepicker(
    // hook handler
    beforeShowDay: function(tdate) 
        var mydata = $(this).data("mydata");
        var enabled = false;
        var classes = "";
        var title = date;
        $.each(mydata, function() 
            if (this.date.valueOf() === tdate.valueOf())
                enabled = true;
                classes = "highlight";
                title = title + '" data-id ="'+this.id;// my hack to add additional attributes ;)
            
        );        
        return [enabled,classes,title];
    ,
    // event handler
    onSelect: function() 
        var id = $(this).find(".ui-datepicker-current-day").attr("data-id");
        mydata = $(this).data("mydata"),
        selectedData = null;        
        /* search for data id */
        $.each(mydata,function()
            if (this.id == id)
                selectedData = this;
            
        );
        if (selectedData) 
            /* If the event is defined, perform some action here; show a tooltip, navigate to a URL, etc. */
            alert(selectedData);
        
    
).data("mydata",
    // your data
    [
        id:1,
        title: "Five K for charity", 
        date: new Date("02/13/2011")
    , 
    
        id:2,
        title: "Dinner", 
        date: new Date("02/25/2011")
    , 
    
        id:3,
        title: "Meeting with manager", 
        date: new Date("03/01/2011")
    ]);

【讨论】:

以上是关于jQuery UI Datepicker:如何在特定日期添加可点击事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 jQuery UI datepicker 获取日期

如何通过 npm jquery-ui-datepicker-with-i18n 导入 laravel?

jQuery UI Datepicker - 如何动态禁用特定日期

如何更改 jQuery UI datepicker 的主题?

使用 jquery 验证和 jquery-ui datepicker

如何从 DatePicker ui jquery 中删除时间