如何扩展jQueryUI datepicker以接受其他参数?

我喜欢jQueryUI datepicker可以自定义,允许按钮触发显示datepicker,但不幸的是,它不允许你自定义自己的标记。

如果我有这样的标记:

      

为了获得点击按钮时显示的日期选择器,我必须实现以下代码:

 $('.datepicker').datepicker({ showOn:'none' }); $('.datepicker-trigger').click( function() { $('.datepicker').datepicker('show'); }); 

这是上面代码的jsFiddle: http : //jsfiddle.net/P9Qmu/

这一切都很好,但我真正想要做的是传递datepicker函数一个额外的参数,指定一个对象或选择器,指示哪个元素应该触发显示。

例如,我真的希望能够这样做:

 $('.datepicker').datepicker({ showOn:'none', trigger:'.datepicker-trigger' }); 

我知道如何扩展jQuery来添加方法和创建插件,但我不确定如何(或者是否可能)修改现有函数中允许的参数。

有谁知道如何扩展$.datepicker以实现我想要做的事情或至少指出我正确的方向? 任何帮助将非常感激。

怎么样:

 var __picker = $.fn.datepicker; $.fn.datepicker = function(options) { __picker.apply(this, [options]); var $self = this; if (options && options.trigger) { $(options.trigger).bind("click", function () { $self.datepicker("show"); }); } } 

用法:

 $("#date").datepicker({ trigger: "#button" }); $("#date2").datepicker({ trigger: "#button2" }); 

示例: http //jsfiddle.net/gduhm/


或者,使用自己的jQuery插件不那么具有侵入性:

 $.widget("ui.datepicker2", { _init: function() { var $el = this.element; $el.datepicker(this.options); if (this.options && this.options.trigger) { $(this.options.trigger).bind("click", function () { $el.datepicker("show"); }); } } }); 

(类似的用法,除了使用datepicker2或任何你的名字)

示例: http //jsfiddle.net/puVap/

您无法扩展,因为datepicker不使用小部件工厂,因此您无法使用它来扩展它,但您可以覆盖方法并注入代码。 有关Jquery UI Datepicker使用的方法的完整列表,请检查datepicker.jsjquery-ui.js

您可以在自定义JS文件中简单地添加该代码,并且在覆盖之后可以像往常一样调用datepicker

 $.datepicker._selectDay_old = $.datepicker._selectDay; $.datepicker._selectDay = function(id, month, year, td) { this._selectDay_old(id, month, year, td); // Your code here console.log("Injected Custom Method"); } // Call Datepicker after Injecting code $("#datepicker").datepicker() 

为了以防万一,要定义可调用方法,必须遵循此模式的方法名称:

 _Datepicker(target, param1, param2,...,paramN) 

如果您需要调用任何需要引用日历实例的内部方法,您必须执行以下操作:

 var inst = this._getInst(target); this._internalMethod(inst);