Plugin jQuery: aggiunta della funzionalità di richiamata


86

Sto cercando di fornire la funzionalità di richiamata del mio plug-in e mi piacerebbe che funzionasse in un modo un po 'tradizionale:

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

o

myPlugin({options}, anotherFunction());

Come gestisco quel parametro nel codice? È trattata come un'entità completa? Sono abbastanza sicuro di sapere dove posizionare il codice eseguibile, ma come faccio a ottenere il codice da eseguire? Non riesco a trovare molta letteratura sull'argomento.


2
La tua seconda sintassi chiama la funzione invece di passarla. È necessario rimuovere il()
SLaks

6
Personalmente penso che sia meglio avere la richiamata specificata come parte del parametro "opzioni". Ciò è particolarmente vero se si sviluppa che ci sono più motivi di uno per fornire una richiamata.
Pointy

1
Come sarebbe qualcosa del genere, Pointy? Ti interessa fornire una risposta-risposta?
dclowd9901

Risposte:


167

Basta eseguire la richiamata nel plugin:

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

Puoi anche avere la richiamata nell'oggetto opzioni:

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

};

Usalo in questo modo:

$('.elem').myPlugin({
    callback: function() {
        // some action
    }
});

Solo un'aggiunta per questa risposta. C'è un post che spiega questo: jquery-howto.blogspot.com/2009/11/…
RaphaelDDL

@David Come aggiungere il parametro di callback, voglio farlo$('.elem').myPlugin({ callback: function (param) { // some action } });
Jeaf Gilbert

2
@JeaffreyGilbert Dovresti portare anche il contesto jQuery, lo fareioptions.callback.call(this, param);
David Hellsing

@David Voglio due callback, chiamato animateBeforee animateAfter. per favore dimmi come usare la tua soluzione ??
user007

5

Non so se ho capito bene la tua domanda. Ma per la seconda versione: questo chiamerebbe anotherFunctionimmediatamente.

Fondamentalmente il tuo plugin dovrebbe essere una sorta di funzione simile a questa:

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

Devi fornire un oggetto funzione come callback, quindi o function(){...}o anotherFunction(senza ()).


4

Riportare un tuffo nel passato.

Vale la pena notare che se hai passato due argomenti, ad esempio:

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

Quindi chiami il plug-in senza l'argomento delle opzioni ma con una richiamata, ti imbatterai in problemi:

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

Lo uso per renderlo un po 'più flessibile:

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

3

Penso che questo potrebbe aiutarti

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

Avevo condiviso un articolo sulla creazione del tuo plug-in jQuery personalizzato, penso che dovresti controllare che http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/


1

Cambia la funzione del tuo plugin per prendere un secondo parametro. Supponendo che l'utente passi una funzione, quel parametro può essere trattato come una funzione normale.
Nota che puoi anche rendere la richiamata una proprietà del parametro options.

Per esempio:

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

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

    ...
});

0

Un esempio un po 'in ritardo, ma può essere utile. L'utilizzo degli argomenti può creare la stessa funzionalità.

$.fn.myPlugin = function() {
    var el = $(this[0]);
    var args = arguments[0] || {};
    var callBack = arguments[1];
    .....
    if (typeof callback == 'function') {
        callback.call(this);
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.