Плагін jQuery: додавання функціональності зворотного дзвінка


86

Я намагаюся надати функцію зворотного виклику мого плагіна, і я хотів би, щоб він працював дещо традиційно:

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

або

myPlugin({options}, anotherFunction());

Як я обробляю цей параметр у коді? Чи трактується це як одна повноцінна сутність? Я майже впевнений, що знаю, де б я розмістив виконавчий код, але як отримати код для виконання? Здається, я не можу знайти багато літератури на цю тему.


2
Ваш другий синтаксис викликає функцію, а не передає її. Вам потрібно видалити()
SLaks

6
Особисто я думаю, що вам краще, щоб зворотний дзвінок був вказаний як частина параметра "options". Це особливо вірно, якщо виявляється, що причин для зворотного дзвінка більше, ніж одна.
Пойнті

1
Як би виглядало щось подібне, Пойнті? Хочете надати відповідь-відповідь?
dclowd9901

Відповіді:


167

Просто виконайте зворотний дзвінок у плагіні:

$.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
    }
};

Ви також можете мати зворотний виклик в об'єкті options:

$.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
    }
});

Просто додайте до цієї відповіді. Це пояснює це: jquery-howto.blogspot.com/2009/11/…
RaphaelDDL

@David Як додати параметр зворотного виклику, я хочу це зробити$('.elem').myPlugin({ callback: function (param) { // some action } });
Jeaf Gilbert

2
@JeaffreyGilbert Ви також повинні навести контекст jQuery, я б це зробивoptions.callback.call(this, param);
Девід Хеллсінг,

@David Я хочу два зворотних виклики, дзвонив animateBeforeі animateAfter. підкажіть будь ласка як використовувати ваше рішення ??
user007

5

Не знаю, чи правильно я розумію ваше запитання. Але для другої версії: це зателефонує anotherFunctionнегайно.

В основному ваш плагін повинен бути якоюсь функцією, яка виглядає так:

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

Ви повинні надати функцію об'єкта , як зворотний виклик, так як function(){...}і anotherFunction(без ()).


4

Повернення вибуху з минулого.

Варто зазначити, що якщо у вас передано два аргументи, наприклад:

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

Потім ви викликаєте плагін без аргументу options, але із зворотним викликом, тоді у вас виникнуть проблеми:

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

Я використовую це, щоб зробити його трохи гнучкішим:

if($.isFunction(options)) { callback = options }

3

Я думаю, це може вам допомогти

// 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

Змініть свою функцію плагіна, щоб взяти другий параметр. Якщо припустити, що користувач передає функцію, цей параметр можна розглядати як звичайну функцію.
Зверніть увагу, що ви також можете зробити зворотний виклик властивістю параметра options.

Наприклад:

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

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

    ...
});

0

Приклад трохи пізно, але він може бути корисним. Використання аргументів може створити однакову функціональність.

$.fn.myPlugin = function() {
    var el = $(this[0]);
    var args = arguments[0] || {};
    var callBack = arguments[1];
    .....
    if (typeof callback == 'function') {
        callback.call(this);
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.