Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向jQuery DatePicker添加回调的正确方法_Javascript_Jquery_Jquery Ui_Jquery Callback_Jquery Ui Datepicker - Fatal编程技术网

Javascript 向jQuery DatePicker添加回调的正确方法

Javascript 向jQuery DatePicker添加回调的正确方法,javascript,jquery,jquery-ui,jquery-callback,jquery-ui-datepicker,Javascript,Jquery,Jquery Ui,Jquery Callback,Jquery Ui Datepicker,DatePicker有一个内部函数,\u adjustDate(),我想在它后面添加一个回调 现行方法 我现在就是这样做的。基本上,只需将函数定义替换为函数本身,再加上新的操作。这会影响所有的日期选择器,我也不确定这是否是需要的 $(function(){ var old = $.datepicker._adjustdate; $.datepicker._adjustDate = function(){ old.apply(this, arguments);

DatePicker有一个内部函数,
\u adjustDate()
,我想在它后面添加一个回调

现行方法
我现在就是这样做的。基本上,只需将函数定义替换为函数本身,再加上新的操作。这会影响所有的日期选择器,我也不确定这是否是需要的

$(function(){

   var old = $.datepicker._adjustdate;

   $.datepicker._adjustDate = function(){
      old.apply(this, arguments);

      // custom callback here     
      console.log('callback');
   };

});
_adjustDate是下一个月/上一个月单击期间的名称。该函数采用三个参数。我很好奇是否有更好的方法添加回调


预期结果
我希望最终结果是这样的;其中,
afterAjustDate
是回调句柄:

$('#datepicker').datepicker({ 
       showButtonPanel: true
     , afterAdjustDate: function(){ $(this).find('foo').addClass('bar'); }
});

供参考
onChangeMonthYear
是不可接受的事件替代方案,
live()
/
delegate()
(在IE中不工作)绑定选项也是不可接受的


这是因为选择月份后需要应用类/操作元素。更改月份会在日历中重新创建元素;执行此操作时,jQueryUI不够聪明,无法继承类更改。因此,在更改日期后,我需要一个回调。

我编写了一个小型演示程序来实现这一点

我创建一个对象文本,其中包含对$.datepicker的扩展,然后对$.datepicker和我的对象执行$.extend

您可以在这里查看:

以下是扩展本身:

(function($){
    var datepickerExtensions = {
        _oldAdjustDate: $.datepicker._adjustDate,
        _adjustDate: function(id, offset, period) { 
            var target = $(id);
            var inst = this._getInst(target[0]);
            var afterAdjustDate = this._get(inst, 'afterAdjustDate');
            this._oldAdjustDate(id, offset, period);
            if(afterAdjustDate && typeof afterAdjustDate === 'function'){
                afterAdjustDate(id, offset, period);
            }
        }
    }
    $.extend($.datepicker, datepickerExtensions);
})(jQuery);
还有演示:

(html)

有一个选项可用于将回调函数传递给日期选择器。听起来这可能是您所需要的内置解决方案

$('.datepicker').datepicker({
  onSelect: function(selectedDate) {
    // custom callback logic here
    alert(selectedDate);
  }
});

在Datepicker v1.0.0上,您可以使用
pick
选项

    var date = new Date();
    $('.datepicker-trigger').datepicker({
        format: 'mm/dd/yyyy',
        autoPick: false,
        startDate: date.getDate(),
        changeMonth: false,
        changeYear: false,
        autoHide: true,
        pick: function (selectedDate) {
            console.log(selectedDate);
        }
    });

打开源代码文件,您可以在
default\u选项中使用几个回调函数

onSelectDate:function(){code>, onSelectTime:函数(){}, onChangeMonth:函数(){}, onGetWeekOfYear:函数(){}, onChangeYear:函数(){}, onChangeDateTime:函数(){}, onShow:function(){}, onClose:function(){}, onGenerate:function(){},
当我有机会时,我会检查一下这是否有效。问题来自于自定义日历,但当它重新绘制时,它不会继承更改。正如我所建议的。一个建议是添加一个检查
afterAdjustDate
是否确实是一个函数:
typeof afterAdjustDate==='function'
。我没有测试这个问题,但我需要结束这个问题。我觉得它大部分看起来像食物。如果您将演示代码复制到您的答案中(以防JSFIDLE崩溃),我将选择此选项。是一个更全面的演示,显示了datepicker post draw的代码更改css。。。这个演示也显示在答案中…您可能会生成一个自定义插件来继承数据采集器代码,并添加您自己的方法和事件。插件的每个实例都有自己的自定义更改,无需以后进行修改。例如,在定义插件时,使用3个选项表单
$.widget('ui.myDatepicker','ui.datapicker',{…})参考以获取更多可能可行的信息:)这是一个老问题,自从我发布jQuery以来,我学到了很多关于jQuery的知识,但我想我会提供一些代表并得到答案。-1因为你没有用你的评论更新你的问题。@DarthVader:同样,这不适用于这里-问题不是可怕的解决方案(就像你留下的那种)这就是我要找的,太好了!
$('.datepicker').datepicker({
  onSelect: function(selectedDate) {
    // custom callback logic here
    alert(selectedDate);
  }
});
    var date = new Date();
    $('.datepicker-trigger').datepicker({
        format: 'mm/dd/yyyy',
        autoPick: false,
        startDate: date.getDate(),
        changeMonth: false,
        changeYear: false,
        autoHide: true,
        pick: function (selectedDate) {
            console.log(selectedDate);
        }
    });