Создание плагина JQuery с несколькими функциями - PullRequest
8 голосов
/ 04 ноября 2010

хорошо, я немного новичок в плагинах, я использовал много в своих проектах, я также написал базовые плагины, которые работают только с элементами с опциями:

(function($){
    $.fn.pulse = function(options) {
        // Merge passed options with defaults
        var opts = jQuery.extend({}, jQuery.fn.pulse.defaults, options);
        return this.each(function() {
            obj = $(this);             
            for(var i = 0;i<opts.pulses;i++) {
                obj.fadeTo(opts.speed,opts.fadeLow).fadeTo(opts.speed,opts.fadeHigh);
            };
            // Reset to normal
            obj.fadeTo(opts.speed,1);
        });
    };
    // Pulse plugin default options
    jQuery.fn.pulse.defaults = {
        speed: "slow",
        pulses: 2,
        fadeLow: 0.2,
        fadeHigh: 1
    };
})(jQuery); 

вышеописанное работает нормально, но, очевидно, оно выполняет одну задачу, в идеале я хотел бы иметь возможность выполнять несколько задач в плагине, чтобы я мог использовать:

$('#div').myplugin.doThis(options);
$('#div').myplugin.doThat(options;

причина в том, что у меня довольно большой скрипт, который выполняет различные вызовы ajax для сохранения данных и запроса данных из базы данных (используя внешний файл php). Я хотел бы интегрировать все эти функции в плагин, но я не Я знаю, какую структуру лучше использовать для этого, я просмотрел очень много учебников и, по сути, сжег свой мозг, и я не понимаю, как мне поступить.

это просто вопрос создания новой функции, такой как:

$.fn.pluginname.dothis = function(options){
        return this.each(function() {
            //execute code
        };
   };

любые указатели на это или шаблон, который поможет мне начать, были бы очень полезны.

вечно нуждающийся в помощи !!!


следующая задача:

(function($){
// Can use $ without fear of conflicts
    //var gmap3plugin = $.fn.gmap3plugin;
    var obj = this; // "this" is the jQuery object

    var methods = {
        init : function(options){
            var lat = $.fn.gmap3plugin.defaults[lat];
            var lng = $.fn.gmap3plugin.defaults[lng];
            alert('init'+' lat:'+lat+' --- lng:'+lng);
        },
        show : function( ) {  },
        hide : function( ) { },
        update : function( content ) { }
    };



    $.fn.gmap3plugin = function(method){
        // Method calling logic
        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.tooltip' );
        };
    };
    $.fn.gmap3plugin.defaults = {
        mapdiv :'#mapdiv',
        region : 'uk',
        lat : 53.4807125,
        lng : -2.2343765
    };
})(jQuery);

это функционирует и получает правильную функцию, которая передается, но как мне получить доступ к значениям в $ .fn.gmap3plugin.defaults? код в моем методе init возвращает undefined для lat и lng

init : function(options){
    var lat = $.fn.gmap3plugin.defaults[lat];
    var lng = $.fn.gmap3plugin.defaults[lng];
    alert('init'+' lat:'+lat+' --- lng:'+lng);
},

или я не могу получить доступ к данным в $ .fn.gmap3plugin.defaults из функции ???

Ответы [ 2 ]

9 голосов
/ 04 ноября 2010

Если вы посмотрите на дизайн некоторых других плагинов jQuery и пользовательского интерфейса jQuery, то, что они делают, они имеют единственную функцию $('#div').myplugin({options}), и затем они могут выполнять различные функции, передавая строку вместо объекта $('#div').myplugin('performdifferenttask') которая в свою очередь может вызывать вспомогательную функцию, которая скрыта от пользователя.

Например, посмотрите на http://jqueryui.com/demos/progressbar/#methods

Вот пример, который, как мы надеемся, ослабит вашу путаницу:

(function($) {
    $.fn.myplugin = function(options) {
        if(options == 'function1')
            function1();
        else if(options == 'function2')
            function2();
        else {
            //do default action
        }
    }

    function function1() {
        //do something
    }

    function function2() {
        //do something else
    }
}

Затем используется:

$.myplugin({option1: 4, option2: 6}); //does default behavior
$.myplugin('function1'); //calls function1()
$.myplugin('function2'); //calls function2()
7 голосов
/ 07 августа 2014

После ответа Сэмюэля вы также можете использовать следующее, чтобы избежать двойной обработки имен функций:

(function($) {
    $.fn.myplugin = function(options, param) {
        if( typeof(this[options]) === 'function' ) {
            this[options](param);
        }
        // do default action

        this.function1 = function() {
            //do something
        }

        this.function2 = function(param) {
            //do something else (with a parameter)
        }
    }    
}

Добавление переменной param позволяет вам вызывать функции, как показано ниже:

$.myplugin(); // does default behaviour
$.myplugin('function1'); // run function 1
$.myplugin('function2'); // run function 2
$.myplugin('function2',{ option1 : 4, option2 : 6 }); // run function 2 with a parameter object

См. http://jsfiddle.net/tonytlwu/ke41mccd/ для демонстрации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...