jQuery Eklentisi: Geri arama işlevselliği ekleme


86

Eklenti geri arama işlevselliğimi vermeye çalışıyorum ve biraz geleneksel bir şekilde çalışmasını istiyorum:

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

veya

myPlugin({options}, anotherFunction());

Kodda bu parametreyi nasıl işleyebilirim? Tek bir tam varlık olarak muamele görüyor mu? Yürütme kodunu nereye yerleştireceğimi bildiğimden oldukça eminim, ancak çalıştırılacak kodu nasıl edinebilirim? Konuyla ilgili çok fazla literatür bulamıyorum.


2
İkinci sözdiziminiz, geçmek yerine işlevi çağırır. Sen kaldırmak gerekir()
SLaks

6
Kişisel olarak, geri aramanın "seçenekler" parametresinin bir parçası olarak belirtilmesinin daha iyi olacağını düşünüyorum. Bu, özellikle bir geri arama sağlamak için birden fazla neden olduğu ortaya çıkarsa doğrudur.
Sivri

1
Böyle bir şey nasıl görünür, Sivri? Bir cevap vermek ister misiniz?
dclowd9901

Yanıtlar:


167

Eklentideki geri aramayı yürütün:

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

Geri aramayı options nesnesinde de yapabilirsiniz:

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

};

Bunu şu şekilde kullanın:

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

Bu cevaba sadece bir ekleme. Bunu açıklayan bir gönderi var: jquery-howto.blogspot.com/2009/11/…
RaphaelDDL

@David Geri arama parametresi nasıl eklenir, bunu yapmak istiyorum$('.elem').myPlugin({ callback: function (param) { // some action } });
Jeaf Gilbert

2
@JeaffreyGilbert JQuery bağlamını da getirmelisin, yapardımoptions.callback.call(this, param);
David Hellsing

@David animateBeforeve adlı iki geri arama istiyorum animateAfter. lütfen bana çözümünü nasıl kullanacağımı söyle?
user007

5

Sorunuzu doğru anladığımı bilmiyorum. Ancak ikinci versiyon için: Bu anotherFunctionhemen arayacaktır .

Temel olarak eklentiniz şuna benzeyen bir tür işlev olmalıdır:

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

Geri çağrı olarak bir işlev nesnesi sağlamalısınız , yani ya function(){...}da anotherFunction(olmadan ()).


4

Geçmişten bir patlama geri getiriyor.

Örneğin, iki argümanınız varsa şunu belirtmek gerekir:

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

Ardından eklentiyi seçenekler argümanı olmadan çağırırsınız, ancak bir geri arama ile sorunla karşılaşırsınız:

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

Bunu biraz daha esnek hale getirmek için kullanıyorum:

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

3

Sanırım bu sana yardımcı olabilir

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

Kendi jQuery Eklentinizi Oluşturma hakkında bir makale paylaşmıştım. Http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/ adresini kontrol etmeniz gerektiğini düşünüyorum.


1

İkinci bir parametre almak için eklenti işlevinizi değiştirin. Kullanıcının bir işlevi geçtiğini varsayarsak, bu parametre normal bir işlev olarak değerlendirilebilir.
Geri aramayı options parametresinin bir özelliği de yapabileceğinizi unutmayın.

Örneğin:

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

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

    ...
});

0

Bir örnek biraz geç ama faydalı olabilir. Bağımsız değişkenlerin kullanılması aynı işlevi oluşturabilir.

$.fn.myPlugin = function() {
    var el = $(this[0]);
    var args = arguments[0] || {};
    var callBack = arguments[1];
    .....
    if (typeof callback == 'function') {
        callback.call(this);
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.