Saya mencoba menulis plugin jQuery yang akan menyediakan fungsi / metode tambahan untuk objek yang memanggilnya. Semua tutorial yang saya baca online (telah menjelajah selama 2 jam terakhir) termasuk, paling banyak, cara menambahkan opsi, tetapi bukan fungsi tambahan.
Inilah yang ingin saya lakukan:
// memformat div untuk menjadi wadah pesan dengan memanggil plugin untuk div itu
$("#mydiv").messagePlugin();
$("#mydiv").messagePlugin().saySomething("hello");
atau sesuatu di sepanjang garis itu. Inilah intinya: Saya memanggil plugin, lalu saya memanggil fungsi yang terkait dengan plugin itu. Sepertinya saya tidak dapat menemukan cara untuk melakukan ini, dan saya telah melihat banyak plugin melakukannya sebelumnya.
Inilah yang saya miliki sejauh ini untuk plugin:
jQuery.fn.messagePlugin = function() {
return this.each(function(){
alert(this);
});
//i tried to do this, but it does not seem to work
jQuery.fn.messagePlugin.saySomething = function(message){
$(this).html(message);
}
};
Bagaimana saya bisa mencapai sesuatu seperti itu?
Terima kasih!
Pembaruan 18 Nov 2013: Saya telah mengubah jawaban yang benar untuk komentar dan upvotes Hari berikut ini.
sumber
this.data('tooltip', $.extend(true, {}, $.fn.tooltip.defaults, methodOrOptions));
jadi sekarang saya dapat mengakses opsi kapan pun saya inginkan setelah inisialisasi.init
.Inilah pola yang saya gunakan untuk membuat plugin dengan metode tambahan. Anda akan menggunakannya seperti:
atau, untuk memanggil metode secara langsung,
Contoh:
sumber
;
baris pertama Anda? tolong jelaskan kepada saya :)Bagaimana dengan pendekatan ini:
Objek yang dipilih disimpan dalam penutupan messagePlugin, dan fungsi itu mengembalikan objek yang berisi fungsi yang terkait dengan plugin, di setiap fungsi Anda dapat melakukan tindakan yang diinginkan ke objek yang dipilih saat ini.
Anda dapat menguji dan bermain dengan kode di sini .
Sunting: Kode yang diperbarui untuk menjaga kekuatan rantai jQuery.
sumber
$('p').messagePlugin()
kecuali Anda memanggil salah satu dari dua fungsi yang dikembalikan.Masalah dengan jawaban yang dipilih saat ini adalah bahwa Anda tidak benar-benar membuat instance baru plugin kustom untuk setiap elemen dalam pemilih seperti yang Anda pikir sedang Anda lakukan ... Anda sebenarnya hanya membuat satu instance dan mengirimkannya pemilih itu sendiri sebagai ruang lingkup.
Lihat biola ini untuk penjelasan lebih dalam.
Sebagai gantinya, Anda harus mengulangi pemilih menggunakan jQuery.each dan membuat instance baru plugin kustom untuk setiap elemen dalam pemilih.
Begini caranya:
Dan biola yang bekerja .
Anda akan melihat bagaimana di biola pertama, semua div selalu dipindahkan ke kanan dengan jumlah piksel yang persis sama. Itu karena hanya satu objek opsi ada untuk semua elemen dalam pemilih.
Dengan menggunakan teknik yang ditulis di atas, Anda akan melihat bahwa pada biola kedua, setiap div tidak disejajarkan dan dipindahkan secara acak (tidak termasuk div pertama karena randomizer selalu diatur ke 1 pada baris 89). Itu karena kita sekarang benar instantiating contoh plugin kustom baru untuk setiap elemen dalam pemilih. Setiap elemen memiliki objek opsi sendiri dan tidak disimpan di pemilih, tetapi dalam contoh plugin kustom itu sendiri.
Ini berarti Anda akan dapat mengakses metode plugin khusus yang dipakai pada elemen tertentu di DOM dari pemilih jQuery baru dan tidak dipaksa untuk men-cache mereka, karena Anda akan berada di biola pertama.
Sebagai contoh, ini akan mengembalikan array dari semua objek pilihan menggunakan teknik di biola kedua. Itu akan kembali tidak terdefinisi di yang pertama.
Ini adalah bagaimana Anda harus mengakses objek pilihan di biola pertama, dan hanya akan mengembalikan satu objek, bukan array dari mereka:
Saya sarankan menggunakan teknik di atas, bukan yang dari jawaban yang dipilih saat ini.
sumber
$('.my-elements').find('.first-input').customPlugin('update', 'first value').end().find('.second-input').customPlugin('update', 'second value'); returns Cannot read property 'end' of undefined
. jsfiddle.net/h8v1k2pLjQuery telah membuat ini jauh lebih mudah dengan diperkenalkannya Pabrik Widget .
Contoh:
Inisialisasi:
Metode memanggil:
(Ini adalah bagaimana perpustakaan jQuery UI dibangun.)
sumber
Pendekatan yang lebih sederhana adalah dengan menggunakan fungsi bersarang. Kemudian Anda bisa memadukannya dengan cara yang berorientasi objek. Contoh:
Dan inilah cara menyebutnya:
Berhati-hatilah. Anda tidak dapat memanggil fungsi bersarang sampai fungsi itu dibuat. Jadi Anda tidak bisa melakukan ini:
Fungsi DoEvenMore bahkan tidak ada karena fungsi DoSomething belum dijalankan yang diperlukan untuk membuat fungsi DoEvenMore. Untuk sebagian besar plugin jQuery, Anda benar-benar hanya akan memiliki satu tingkat fungsi bersarang dan bukan dua tingkat seperti yang saya tunjukkan di sini.
Pastikan bahwa ketika Anda membuat fungsi bersarang Anda mendefinisikan fungsi-fungsi ini di awal fungsi induknya sebelum kode lain dalam fungsi induk dijalankan.
Akhirnya, perhatikan bahwa anggota "ini" disimpan dalam variabel yang disebut "_ini". Untuk fungsi bersarang, Anda harus mengembalikan "_ini" jika Anda memerlukan referensi ke instance di klien panggilan. Anda tidak bisa hanya mengembalikan "ini" dalam fungsi bersarang karena itu akan mengembalikan referensi ke fungsi dan bukan contoh jQuery. Mengembalikan referensi jQuery memungkinkan Anda untuk mengaitkan metode jQuery intrinsik saat kembali.
sumber
Saya mendapatkannya dari jQuery Plugin Boilerplate
Juga dijelaskan di jQuery Plugin Boilerplate, reprise
sumber
$('.first-input').data('pluginName').publicMethod('new value').css('color', red);
mengembalikanCannot read property 'css' of undefined
jsfiddle.net/h8v1k2pL/1return $element
dalam contoh ini Anda akan mengubahnya menjadiplugin.foo_public_method = function() {/* Your Code */ return $element;}
@Salim terima kasih telah membantu saya ... github.com/AndreaLombardo/BootSideMenu/pull/34Terlambat tapi mungkin itu bisa membantu seseorang suatu hari.
Saya berada dalam situasi yang sama seperti, membuat plugin jQuery dengan beberapa metode, dan setelah membaca beberapa artikel dan beberapa ban saya membuat boilerplate plugin jQuery ( https://github.com/acanimal/jQuery-Plugin-Boilerplate ).
Selain itu, saya mengembangkan dengannya sebuah plugin untuk mengelola tag ( https://github.com/acanimal/tagger.js ) dan menulis dua posting blog yang menjelaskan langkah demi langkah pembuatan plugin jQuery ( http: // acuriousanimal. com / blog / 2013/01/15 / hal-i-pelajari-membuat-jquery-plugin-bagian-i / ).
sumber
Anda dapat melakukan:
Dengan cara ini objek plugin Anda disimpan sebagai nilai data dalam elemen Anda.
sumber
Bagaimana dengan menggunakan pemicu? Apakah ada yang tahu ada kelemahan menggunakannya? Manfaatnya adalah bahwa semua variabel internal dapat diakses melalui pemicu, dan kode ini sangat sederhana.
Lihat di jsfiddle .
Contoh penggunaan
Plugin
sumber
Di sini saya ingin menyarankan langkah-langkah untuk membuat plugin sederhana dengan argumen.
Di sini, kami telah menambahkan objek default yang dipanggil
params
dan menetapkan nilai default opsi menggunakanextend
fungsi. Oleh karena itu, Jika kita melewati argumen kosong maka itu akan menetapkan nilai default sebagai gantinya sebaliknya akan ditetapkan.Baca selengkapnya: Cara Membuat plugin JQuery
sumber
Coba yang ini:
sumber
Ini adalah versi sederhana dari ini. Mirip dengan yang diposting sebelumnya, Anda akan memanggil seperti:
-atau mengakses instance secara langsung @
plugin_MessagePlugin
MessagePlugin.js
sumber
Berikut plugin-struktur memanfaatkan jQuery-
data()
-Metode untuk menyediakan antarmuka publik untuk intern plugin-metode / -settings (sambil menjaga jQuery-chainability):Sekarang Anda dapat memanggil metode plugin internal untuk mengakses atau mengubah data plugin atau elemen yang relevan menggunakan sintaks ini:
Selama Anda mengembalikan elemen saat ini (ini) dari dalam implementasi
myPublicPluginMethod()
jQuery-chainability Anda akan dipertahankan - sehingga hal-hal berikut berfungsi:Berikut adalah beberapa contoh (untuk detail checkout biola ini ):
sumber
Ini sebenarnya bisa dibuat untuk bekerja dengan cara yang "baik" menggunakan
defineProperty
. Di mana "nice" berarti tanpa harus menggunakan()
untuk mendapatkan plugin namespace atau harus melewati fungsi name by string.Nit kompatibilitas:
defineProperty
tidak berfungsi di browser kuno seperti IE8 dan di bawah. Peringatan:$.fn.color.blue.apply(foo, args)
tidak akan berfungsi, Anda harus menggunakanfoo.color.blue.apply(foo, args)
.Tautan JSFiddle
sumber
Menurut standar jquery Anda dapat membuat plugin sebagai berikut:
Bagaimana cara memanggil plugin ini?
Referensi: tautan
sumber
Saya pikir ini dapat membantu Anda ...
Dalam contoh di atas saya telah membuat plugin sorot jquery sederhana. Saya telah berbagi artikel yang telah saya bahas tentang Cara Membuat Plugin jQuery Anda Sendiri dari Basic hingga Advance. Saya pikir Anda harus memeriksanya ... http://mycodingtricks.com/jquery/how-to-create-your-own-jquery-plugin/
sumber
Berikut ini adalah plug-in kecil yang memiliki metode peringatan untuk tujuan debugging. Simpan kode ini di file jquery.debug.js: JS:
HTML:
sumber
Inilah cara saya melakukannya:
sumber
Apa yang Anda lakukan pada dasarnya meluas objek jQuery.fn.messagePlugin dengan metode baru. Yang berguna tetapi tidak dalam kasus Anda.
Yang harus Anda lakukan adalah menggunakan teknik ini
Tetapi Anda dapat mencapai apa yang Anda inginkan. Maksud saya ada cara untuk melakukan $ ("# mydiv"). MessagePlugin (). SaySomething ("hello"); Teman saya dia mulai menulis tentang lugins dan bagaimana memperluasnya dengan rangkaian fungsi Anda di sini adalah tautan ke blog-nya
sumber