Javascript jQuery日期选择器“;更新后";事件或同等事件

Javascript jQuery日期选择器“;更新后";事件或同等事件,javascript,jquery,jquery-ui,javascript-events,Javascript,Jquery,Jquery Ui,Javascript Events,我正在使用一个标准的jQuery日期选择器,我需要根据一些日常状态信息修改每个TD中的文本。我意识到我可以连接“beforeShowDay”事件,但这只允许我修改每个日期的css信息。希望在整个日历上有一个事件,如“afterRender”等 我可以修改显示的第一个日历,但如果用户更改了月份或年份,则我(或我的代码)将退出循环。您可以执行以下操作: $('.selector').datepicker({ beforeShowDay: function(date) { /*s

我正在使用一个标准的jQuery日期选择器,我需要根据一些日常状态信息修改每个TD中的文本。我意识到我可以连接“beforeShowDay”事件,但这只允许我修改每个日期的css信息。希望在整个日历上有一个事件,如“afterRender”等

我可以修改显示的第一个日历,但如果用户更改了月份或年份,则我(或我的代码)将退出循环。

您可以执行以下操作:

$('.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*/ 
   }
});

看起来像是一个增强功能,而且已经提出了一个增强功能,但似乎还没有任何改进

你可以(现在)自己实现它

下载-see并搜索
\u updatedTepicker: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)')]);
},
我刚刚对函数进行了编码,使其具有与相同的签名,但随后添加了第三个参数—
元素数组

然后,您可以按照通常的方式将自己的回调添加到
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"/>

$(函数(){
$('#dp')。日期选择器({
后显示:功能(输入、安装、td){
console.log(td);//需要一个带有控制台的浏览器(例如Chrome/Firefox+Firebug)
}
});
});
注意:我没有做太多的测试,但它似乎是在呈现日期选择器之后调用的。如果它不完全符合您的要求,它可能需要更多的工作来满足您的要求。尽管如此,希望它能帮到您:-)如果您需要“后处理”-事件在jquery ui 1.9版之前,您可以覆盖datepicker.\u 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在datepicker元素的每次更新之后都会引发一个“afterShow”事件


我知道这不是解决此问题的最佳方法,但它比更改原始jquery ui代码要好。

我知道这是另一个难看的攻击,但我只是添加了一个超时,如下所示

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

Neal,我知道这些,事实上在这个特定的应用程序中使用它们,但我需要在文本呈现后修改TD文本内容,这只能在这些事件完成后才能完成。即使是像afterShowDay(date)这样的事件会有用的。这个答案似乎解决了我的问题,但我还没有探讨实际的解决方案。我们决定,目前,通过onBeforeShowDay活动设计一天的能力可能涵盖了客户80%的需求。(我们的客户是我们公司的内部业务部门,目前已经足够了。)回答很好。但是你应该在外部附加你的修改,以保持原始jquery文件的完整性。在你合适的JS文件中,你可以进行修改,比如保存原始函数
$.datepicker.\u updateDatepicker.\u original=$.datepicker.\u updateDatepicker;
并修改新版本(先调用旧版本)理想情况下,猴子补丁应该查看函数库的版本。考虑将此添加到函数的顶部:($ .u.Value= = unDeand & u..Value.IdxOf(‘1’)!=0){Read;} /Cuth>可以将所有的代码包在<代码>中(函数($){< /代码>和<代码> })(jQuery);< /C> >,而不是<代码> $(函数({)})像小部件一样。这是一个出色的解决方案。与jquery ui 1.11.4+jquery 1.11.3配合使用,Markus answer更好,因为它在不接触原始代码的情况下向现有小部件添加功能。当前日历中的每一天都会调用
setTimeout
中的代码,这很糟糕。我同意你的看法,正如我所说:丑陋的黑客。这是我唯一能找到工作的解决方案!我把这个答案作为任何其他绝望的灵魂的“最后手段”选择。我会尽快尝试重构我的代码来解决这个问题。或者你可以改为在onChangeMonthYear中使用setTimeout,它每月只会触发一次渲染。但仍然是一个黑客。。。