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

Phi*_*ton 9 jquery jquery-ui jquery-plugins

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

如果我有这样的标记:

<span>
    <input type="text" class="datepicker" />
</span>
<span>
    <button class="datepicker-trigger">Open</button>
</span>
Run Code Online (Sandbox Code Playgroud)

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

$('.datepicker').datepicker({
    showOn:'none'
});
$('.datepicker-trigger').click( function() {
    $('.datepicker').datepicker('show');
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

$('.datepicker').datepicker({
    showOn:'none',
    trigger:'.datepicker-trigger'
});
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*ker 16

怎么样:

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");
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

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

$("#date2").datepicker({
    trigger: "#button2"
});
Run Code Online (Sandbox Code Playgroud)

示例: 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");
            });
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

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

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