beforeShow事件未在jQueryUI Datepicker上触发

时间:2010-10-18 18:00:44

标签: jquery-ui datepicker

无论我尝试什么,我都无法在我的日期选择器上触发beforeShow事件。这是我的代码:

$('#calendar').datepicker({
inline: true,
dateFormat: 'mm,dd,yy',
beforeShow: function(input, inst) { alert('before'); }
});

我已将beforeShowDay和onSelect事件添加到我的datepicker中,并且它们会正确触发。还有其他人遇到过麻烦吗?

6 个答案:

答案 0 :(得分:25)

这是我的团队提出的解决方案,因此我们不必记住每次更新时都要修改jQuery文件。只需将其添加到您自己的脚本中并包含它:

(function ($) {
    $.extend($.datepicker, {

        // Reference the orignal function so we can override it and call it later
        _inlineDatepicker2: $.datepicker._inlineDatepicker,

        // Override the _inlineDatepicker method
        _inlineDatepicker: function (target, inst) {

            // Call the original
            this._inlineDatepicker2(target, inst);

            var beforeShow = $.datepicker._get(inst, 'beforeShow');

            if (beforeShow) {
                beforeShow.apply(target, [target, inst]);
            }
        }
    });
}(jQuery));

答案 1 :(得分:5)

实际上,这是更正确的(并遵循插件/类模式):

var beforeShow = $.datepicker._get(inst, 'beforeShow');
extendRemove(inst.settings, (beforeShow ? beforeShow.apply(target, [target, inst]) : {}));

答案 2 :(得分:4)

我找到了解决方法。 您必须在jquery.ui.datepicker.js(完整版)中添加3行代码

在第274行附近,找到此this._updateAlternate(inst);

在此行之后,请填写以下内容:

var beforeShow = $.datepicker._get(inst, 'beforeShow');
if(beforeShow)
   beforeShow.apply();

来自jqueryui.com的版本没有为内联datepicker启用beforeShow。 使用此代码,启用beforeShow。

答案 3 :(得分:1)

我想使用beforeShow更新结束日期datepicker上的最小日期,以反映开始日期datepicker中设置的日期。我已经在这里和其他地方发布了一些复杂的解决方案。我可能会遗漏一些东西,但以下非常简单的代码对我有效。

如果尚未设置并且尝试输入结束日期,则会将焦点重置为开始日期。如果已设置开始日期,则会相应地设置结束_Date的最小日期。

    $(function(){
    $("#start_Date").datepicker({
        changeMonth: true,
        changeYear: true,
        yearRange: "c-1:c+5",
        dateFormat: "dd-mm-yy"
    });
    $("#end_Date").datepicker({
        changeMonth: true,
        changeYear: true,
        yearRange: "c-1:c+5",
        dateFormat: "dd-mm-yy",
        beforeShow: end_Range
    });

    function end_Range(){
        if ($("#start_Date").datepicker("getDate") == null ){
            $("#start_Date").focus();
        } else {
            // set minimum date range
            $("#end_Date").datepicker("option", "minDate", new Date ($("#start_Date").datepicker("getDate")));
        };
    };
});

使用日期字段:

<label>Date</label><input class="datepicker" id="start_Date" type="text"/>
<label>Date</label><input class="datepicker" id="end_Date" type="text"/>

答案 4 :(得分:0)

这有点棘手,但使用 setTimeout 方法启动该功能对我来说效果很好。

$('#calendar').datepicker({
inline: true,
dateFormat: 'mm,dd,yy',
beforeShow: function() { 
    setTimeout(function() {
        alert('before'); 
    }, 10);
}
});

答案 5 :(得分:0)

您之前是否已将datepicker()指定给此元素?

firstShow事件在第一次分配datepicker()时附加到元素。 如果将datepicker()重新分配给同一个元素,则它将无法正常工作。

尽量摧毁&#39;并重新分配对我来说很有用的datepicker()。

$('#calendar').datepicker('destroy');

$('#calendar').datepicker({
    inline: true,
    dateFormat: 'mm,dd,yy',
    beforeShow: function(input, inst) {
        alert('before');
    }
});