Плагин jQuery: добавление функции обратного вызова - PullRequest
83 голосов
/ 29 марта 2010

Я пытаюсь настроить функцию обратного вызова моего плагина, и мне бы хотелось, чтобы он работал несколько традиционным образом:

myPlugin({options}, function() {
    /* code to execute */
});

или

myPlugin({options}, anotherFunction());

Как мне обработать этот параметр в коде? Это рассматривается как одно целое? Я почти уверен, что знаю, куда бы я поместил исполняемый код, но как мне заставить код выполняться? Кажется, я не могу найти много литературы по этой теме.

Ответы [ 6 ]

164 голосов
/ 29 марта 2010

Просто выполните обратный вызов в плагине:

$.fn.myPlugin = function(options, callback) {
    if (typeof callback == 'function') { // make sure the callback is a function
        callback.call(this); // brings the scope to the callback
    }
};

Вы также можете использовать обратный вызов в объекте параметров:

$.fn.myPlugin = function() {

    // extend the options from pre-defined values:
    var options = $.extend({
        callback: function() {}
    }, arguments[0] || {});

    // call the callback and apply the scope:
    options.callback.call(this);

};

Используйте это так:

$('.elem').myPlugin({
    callback: function() {
        // some action
    }
});
5 голосов
/ 29 марта 2010

Не знаю, правильно ли я понимаю ваш вопрос. Но для второй версии: это немедленно вызвало бы anotherFunction.

В основном ваш плагин должен иметь какую-то функцию, которая выглядит следующим образом:

var myPlugin = function(options, callback) {
    //do something with options here
    //call callback
    if(callback) callback();
} 

Вы должны предоставить функцию объект в качестве обратного вызова, поэтому либо function(){...}, либо anotherFunction (без ()).

4 голосов
/ 08 февраля 2012

Возвращение взрыва из прошлого.

Стоит отметить, что если передано два аргумента, например:

$.fn.plugin = function(options, callback) { ... };

Затем вы вызываете плагин без аргумента опций, но с обратным вызовом, тогда у вас возникают проблемы:

$(selector).plugin(function() {...});

Я использую это, чтобы сделать его немного более гибким:

if($.isFunction(options)) { callback = options }
3 голосов
/ 08 апреля 2015

Я думаю, что это может помочь вам

// Create closure.
(function( $ ) {
  
   // This is the easiest way to have default options.
 
        var settings = $.extend({
            // These are the defaults.
 
            onready: function(){},
 
            //Rest of the Settings goes here...
        }, options );
 
    // Plugin definition.
    $.fn.hilight = function( options ) {
 
        //Here's the Callback
        settings.onready.call(this);
 
        //Your plugin code goes Here
    };
  
// End of closure.
  
})( jQuery );

Я поделился статьей о создании собственного плагина jQuery. Думаю, вам следует проверить, что http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/

1 голос
/ 29 марта 2010

Измените функцию вашего плагина, чтобы получить второй параметр. Предполагая, что пользователь передает функцию, этот параметр можно рассматривать как обычную функцию.
Обратите внимание, что вы также можете сделать обратный вызов свойством параметра options.

Например:

$.fn.myPlugin = function(options, callback) {
    ...

    if(callback)        //If the caller supplied a callback
        callback(someParam);

    ...
});
0 голосов
/ 18 апреля 2013

Пример немного запоздал, но это может быть полезно. Использование аргументов может создать такую ​​же функциональность.

$.fn.myPlugin = function() {
    var el = $(this[0]);
    var args = arguments[0] || {};
    var callBack = arguments[1];
    .....
    if (typeof callback == 'function') {
        callback.call(this);
    }
}
...