JQuery Datepicker "После обновления" Событие или эквивалент

Я использую стандартный jQuery Datepicker, и мне нужно изменить текст в каждом TD на основе некоторой ежедневной информации о состоянии. Я понимаю, что могу подключить событие "beforeShowDay", но это только позволяет мне изменять информацию css для каждой даты. Надеемся на событие во всем календаре, таком как "afterRender" и т.д.

Я могу изменить первый календарь, который отображается, но если пользователь меняет месяцы или годы, я (или мой код) вышел из цикла.

Ответ 1

Похож на afterShow() и onAfterChangeMonthYear() уже подняты усовершенствования, но пока не существует какой-либо работы над ними.

Вы могли (на данный момент) реализовать его самостоятельно и hellip;

Загрузите последний несжатый источник v1.8.13 - см. http://blog.jqueryui.com/2011/05/jquery-ui-1-8-13/ и выполните поиск _updateDatepicker: function(inst) {, затем добавьте новый вызов функции. Вот как я изложил новую функцию:

_updateDatepicker: function(inst) {
    // existing jQueryUI code cut for brevity
    this._afterShow(inst);
},
_afterShow: function(inst) {
    var afterShow = this._get(inst, 'afterShow');
    if (afterShow)
        afterShow.apply((inst.input ? inst.input[0] : null),
                [(inst.input ? inst.input.val() : ''), inst, inst.dpDiv.find('td:has(a)')]);
},

Я просто закодировал функцию, чтобы иметь ту же подпись, что и beforeShow(), но затем добавил третий параметр - массив элементов <td>.

Затем вы можете добавить свой собственный обратный вызов к datepicker() обычным способом.

<script type="text/javascript">
    $(function() {
        $('#dp').datepicker({
            afterShow: function (input, inst, td) {
               console.log(td); // needs a browser with a console (Chrome / Firefox+Firebug for example)
            }
        });
    });
</script>
<input type="text" id="dp"/>

Примечание. Я не проводил много тестирования, но, похоже, он вызывается после отображения datepicker. Возможно, вам потребуется дополнительная работа, чтобы соответствовать вашим требованиям, если это не совсем то, что вам нужно. Надеюсь, что это все равно поможет: -)

Ответ 2

если вам нужен "afterShow" -event до jquery-ui версии 1.9, вы можете перезаписать функцию datepicker._updateDatepicker.

например:

$(function() {
    $.datepicker._updateDatepicker_original = $.datepicker._updateDatepicker;
    $.datepicker._updateDatepicker = function(inst) {
        $.datepicker._updateDatepicker_original(inst);
        var afterShow = this._get(inst, 'afterShow');
        if (afterShow)
            afterShow.apply((inst.input ? inst.input[0] : null));  // trigger custom callback
    }
});

Теперь datepicker вызывает событие afterShow после каждого обновления из элемента datepicker.

Я знаю, что это не лучший способ решить эту проблему, но это лучше, чем изменить исходный код jquery-ui.

Ответ 3

Вы можете сделать это:

$('.selector').datepicker({
   beforeShowDay: function(date) { 
       /*some function to do before display*/ 
   },
   onChangeMonthYear: function(year, month, inst) { 
       /*some function to do on month or year change*/ 
   }
});

См. DOC

Ответ 4

Я знаю его еще один уродливый хак, но я просто добавляю таймаут, например:

$('.selector').datepicker({
   beforeShowDay: function(date) { 
       setTimeout(function() {
            //your code  
       }, 50); /* TD content is already rendered */ 
   },
});