Событие beforeShow не запускается на jQueryUI Datepicker - PullRequest
23 голосов
/ 18 октября 2010

Независимо от того, что я пытаюсь, я не могу получить событие beforeShow для запуска моего средства выбора даты.Вот мой код:

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

Я добавил события beforeShowDay и onSelect в свой указатель даты, и они работают правильно.У кого-нибудь еще были проблемы с этим?

Ответы [ 6 ]

25 голосов
/ 05 сентября 2012

Вот решение, которое придумала моя команда, поэтому нам не нужно помнить о необходимости изменять файлы 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));
5 голосов
/ 18 марта 2011

На самом деле, это немного более правильно (и следует шаблону плагина / класса):

var beforeShow = $.datepicker._get(inst, 'beforeShow');
extendRemove(inst.settings, (beforeShow ? beforeShow.apply(target, [target, inst]) : {}));
4 голосов
/ 24 февраля 2011

Я нашел исправление для этого. Вы должны добавить 3 строки кода в jquery.ui.datepicker.js (полная версия)

Рядом с линией № 274, найдите это this._updateAlternate(inst);

Сразу после этой строки поставьте следующее:

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

Версия от jqueryui.com не имеет beforeShow для встроенного средства выбора даты. С помощью этого кода, beforeShow включен.

1 голос
/ 11 сентября 2012

Я хотел использовать beforeShow, чтобы обновить минимальную дату в датчике даты окончания, чтобы отразить дату, установленную в датчике даты начала.Я опубликовал ряд решений, опубликованных здесь и в других местах, которые были сложными.Возможно, я что-то упускаю, но следующий довольно простой код работает для меня.

Это сбрасывает фокус на дату начала, если еще не установлена, и делается попытка ввести дату окончания.Если дата начала была установлена, она соответственно устанавливает минимальную дату окончания _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"/>
0 голосов
/ 06 сентября 2016

Вы уже присвоили datepicker () этому элементу?

Событие beforeShow присоединяется к элементу, когда вы назначаете datepicker () в первый раз. Если вы переназначите функцию datepicker () на тот же элемент, он не будет работать должным образом.

Попробуйте «уничтожить» и переназначить функцию datepicker (), которая мне подходит.

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

$('#calendar').datepicker({
    inline: true,
    dateFormat: 'mm,dd,yy',
    beforeShow: function(input, inst) {
        alert('before');
    }
});
0 голосов
/ 22 февраля 2011

Это немного сложно, но использование метода setTimeout для запуска функции хорошо работает для меня.

$('#calendar').datepicker({
inline: true,
dateFormat: 'mm,dd,yy',
beforeShow: function() { 
    setTimeout(function() {
        alert('before'); 
    }, 10);
}
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...