0

jQuery 用の単純なプラグインを作成しました。これは、2 つの指定された datePicker に minDate と maxDate を設定します。今、私はそれを拡張し、日付を設定する機能を追加したいと考えています。

JS

(function($) {

    $.fn.dateRange = function(){
        return this.each(function () { 
            var from, to;
            var self = $(this);
            var selectedDate;
            $("input",this).prop('readonly', true);
            from = $('.from',this);
            to = $('.to',this);
            from.datepicker({
                onClose:function( selectedDate ) {
                    $(this).siblings(".to").datepicker( "option", "minDate", selectedDate );
                }
            });

            to.datepicker({
                onClose:function( selectedDate ) {
                    $(this).siblings(".from").datepicker( "option", "maxDate", selectedDate );
                }
            });
            //add a function
            this.setDate = function (f, t) {
                from.datepicker("option",{
                     defaultDate: new Date(f),
                     maxDate: new Date(t)
                 }).val(f);

                to.datepicker("option",{
                     defaultDate: new Date(t),
                     minDate: new Date(f)
                 }).val(f);
             };
        });
    };

})(jQuery);


$("div.dateRange").dateRange();

//later

$("#label1").dateRange().setDate("07/02/2013","07/06/2013");

コンソールは言う: Uncaught TypeError: Object [object Object] has no method 'setDate'. プラグインに機能を追加する最良の方法は何ですか?

ここに jsbin があります: http://jsbin.com/acovuj/2/edit

4

1 に答える 1

1

多くのコメントで指摘されているように、これを達成する方法はたくさんあります。

シンプルで理解しやすいボイラープレートを次に示します。

;(function($) {

    function init(options) {
        return this.each(function() {
            // your initialization comes here
            // ...
        });
    }

    function setDate(date1, date2) {
        // your implementation comes here
        // ...
    }

    var methods = {
        init: init,
        setDate: setDate
    };

    $.fn.dateRange = function(method) {  
        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        }
        else if (typeof method === 'object' || ! method) {
            return methods.init.apply(this, arguments);
        }
        else {
            $.error('Method ' + method + ' does not exist on jQuery.datePicker');
        }
    };  
})(jQuery);

このセットアップでは、次のようにsetDateメソッドを呼び出します。

$("#label1").dateRange("setDate", "07/02/2013", "07/06/2013");

つまり、setDate実際に呼び出したいメソッドの名前は への引数でありdateRange、直接呼び出しません。

この例をどこで見たか覚えていませんが、これを使用しており、うまく機能しています。この手法を使用した完全かつ単純な例として、数日前に作成した jQuery プラグインを次に示します。それが役立つことを願っています。

于 2013-07-06T12:56:42.590 に答える