Plugin jQuery: Menambahkan fungsionalitas Callback

86

Saya mencoba memberikan fungsionalitas panggilan balik plugin saya, dan saya ingin itu beroperasi dengan cara yang agak tradisional:

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

atau

myPlugin({options}, anotherFunction());

Bagaimana cara menangani parameter itu dalam kode? Apakah itu diperlakukan sebagai satu kesatuan penuh? Saya cukup yakin saya tahu di mana saya akan menempatkan kode eksekutori, tetapi bagaimana saya mendapatkan kode untuk dieksekusi? Sepertinya saya tidak dapat menemukan banyak literatur tentang topik tersebut.

dclowd9901
sumber
2
Sintaks kedua Anda memanggil fungsi alih-alih meneruskannya. Anda perlu menghapus()
SLaks
6
Secara pribadi saya pikir Anda lebih baik meminta callback ditetapkan sebagai bagian dari parameter "opsi". Itu terutama benar jika berkembang bahwa ada lebih dari satu alasan untuk menyediakan callback.
Pointy
1
Bagaimana sesuatu seperti itu terlihat, Pointy? Mau memberikan jawaban-jawaban?
dclowd9901

Jawaban:

167

Jalankan saja callback di 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
    }
};

Anda juga dapat memiliki callback di objek opsi:

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

};

Gunakan seperti ini:

$('.elem').myPlugin({
    callback: function() {
        // some action
    }
});
David Hellsing
sumber
Hanya menambahkan untuk jawaban ini. Ada postingan yang menjelaskan hal ini: jquery-howto.blogspot.com/2009/11/…
RaphaelDDL
@David Bagaimana cara menambahkan parameter panggilan balik, saya ingin melakukan ini$('.elem').myPlugin({ callback: function (param) { // some action } });
Jeaf Gilbert
2
@JeaffreyGilbert Anda harus membawa konteks jQuery juga, saya akan melakukannyaoptions.callback.call(this, param);
David Hellsing
@ David Saya ingin dua panggilan balik, dipanggil animateBeforedan animateAfter. tolong beritahu saya bagaimana menggunakan solusi Anda ??
pengguna007
5

Saya tidak tahu apakah saya memahami pertanyaan Anda dengan benar. Tetapi untuk versi kedua: Ini akan anotherFunctionsegera menelepon .

Pada dasarnya plugin Anda harus memiliki fungsi yang terlihat seperti ini:

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

Anda harus menyediakan objek fungsi sebagai callback, jadi salah satu function(){...}atau anotherFunction(tanpa ()).

Felix Kling
sumber
4

Membawa kembali ledakan dari masa lalu.

Perlu dicatat bahwa jika Anda memiliki dua argumen yang diteruskan, misalnya:

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

Kemudian Anda memanggil plugin tanpa argumen opsi tetapi dengan callback maka Anda akan mengalami masalah:

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

Saya menggunakan ini untuk membuatnya sedikit lebih fleksibel:

if($.isFunction(options)) { callback = options }
Sam Potts
sumber
3

Saya pikir ini mungkin membantu Anda

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

Saya telah membagikan artikel tentang Membuat Plugin jQuery Anda Sendiri. Saya pikir Anda harus memeriksa http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/

Shubham Kumar
sumber
1

Ubah fungsi plugin Anda untuk mengambil parameter kedua. Dengan asumsi bahwa pengguna melewati suatu fungsi, parameter tersebut dapat diperlakukan sebagai fungsi biasa.
Perhatikan bahwa Anda juga dapat menjadikan callback sebagai properti dari parameter opsi.

Sebagai contoh:

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

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

    ...
});
SLaks
sumber
0

Contoh agak terlambat, tapi bisa berguna. Menggunakan argumen dapat membuat fungsionalitas yang sama.

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