Saya mengikat acara klik dengan tombol:
$('#myButton').bind('click', onButtonClicked);
Dalam satu skenario, ini dipanggil beberapa kali, jadi ketika saya melakukan itu trigger
saya melihat beberapa panggilan ajax yang ingin saya cegah.
Bagaimana saya bind
hanya jika tidak terikat sebelumnya.
Jawaban:
Pembaruan 24 Agustus '12 : Di jQuery 1.8, tidak mungkin lagi untuk mengakses acara elemen menggunakan
.data('events')
. (Lihat bug ini untuk detailnya.) Dimungkinkan untuk mengakses data yang sama denganjQuery._data(elem, 'events')
, struktur data internal, yang tidak berdokumen dan karenanya tidak 100% dijamin akan tetap stabil. Namun ini seharusnya tidak menjadi masalah, dan baris yang relevan dari kode plugin di atas dapat diubah sebagai berikut:Peristiwa jQuery disimpan dalam objek data yang disebut
events
, sehingga Anda dapat mencari di ini:Akan lebih baik, tentu saja, jika Anda dapat menyusun aplikasi sehingga kode ini hanya dipanggil sekali.
Ini bisa dienkapsulasi menjadi plugin:
Anda kemudian dapat menelepon:
sumber
<a>
? Karena ketika saya mencobanya dikatakanjQuery._data()
kesalahan berikutTypeError: a is undefined
var data = jQuery._data(this[0], 'events')[type];
dalam menangkap mencoba dan mengembalikan palsu dalam tangkapan. Jika tidak ada peristiwa yang terikat pada ini [0] selain panggilan ke [jenis] akan menyebabkan beberapa variasi "Tidak dapat memperoleh properti 'klik' dari referensi yang tidak terdefinisi atau nol" dan jelas itu juga memberi tahu Anda apa yang perlu Anda ketahui.for (var i = 0; i < data.length; i++) { if (data[i].handler.toString() === fn.toString()) { return true; } }
Satu lagi cara - tandai tombol tersebut dengan kelas CSS dan filter:
Dalam versi jQuery terbaru ganti
bind
denganon
:sumber
Jika menggunakan jQuery 1.7+:
Anda dapat menelepon
off
sebelumnyaon
:Jika tidak:
Anda bisa melepas ikatannya terlebih dahulu:
sumber
.unbind('click', onButtonClicked)
. Lihat manual$(sel).unbind("click.myNamespace");
$('#myButton').unbind('click', onButtonClicked).bind('click', onButtonClicked);
Cara terbaik yang saya lihat adalah menggunakan live () atau delegate () untuk menangkap acara di orangtua dan tidak di setiap elemen anak.
Jika tombol Anda berada di dalam elemen #parent, Anda dapat mengganti:
$('#myButton').bind('click', onButtonClicked);
oleh
$('#parent').delegate('#myButton', 'click', onButtonClicked);
bahkan jika #myButton belum ada saat kode ini dieksekusi.
sumber
Saya menulis sebuah plugin yang sangat kecil yang disebut "sekali" yang melakukan itu. Jalankan elemen aktif dan nonaktif.
Dan sederhana:
sumber
off
menghapus semua penangan untuk jenis yang diberikan? Berarti jika ada penangan klik terpisah yang tidak terkait tetapi pada item yang sama, bukankah itu akan dihapus juga?Kenapa tidak menggunakan ini
unbind()
sebelumbind()
sumber
$('#myButton').off().on('click', onButtonClicked);
juga bekerja untukku.Ini versi saya:
Pemakaian:
sumber
Berdasarkan jawaban @ konrad-garus, tetapi menggunakan
data
, karena saya percayaclass
sebagian besar harus digunakan untuk styling.sumber
Untuk menghindari memeriksa / mengikat / melepaskan ikatan, Anda dapat mengubah pendekatan Anda! Mengapa Anda tidak menggunakan Jquery .on ()?
Karena Jquery 1.7, .live (), .delegate () sudah tidak digunakan lagi, sekarang Anda dapat menggunakan .on () untuk
Ini berarti bahwa Anda dapat melampirkan acara ke elemen induk yang masih ada dan melampirkan elemen anak-anak apakah mereka ada atau tidak!
Saat Anda menggunakan .on () seperti ini:
Anda menangkap peristiwa klik pada orangtua dan itu mencari anak '#myButton' jika ada ...
Jadi, ketika Anda menghapus atau menambahkan elemen turunan, Anda tidak perlu khawatir tentang apakah akan menambah atau menghapus acara yang mengikat.
sumber
.off
yang saya yakin akan menghapus penangan yang tidak terkait dalam proses.Mencoba:
sumber
sumber
Pada Juni 2019, saya telah memperbarui fungsi (dan berfungsi untuk apa yang saya butuhkan)
sumber
JQuery memiliki solusi :
setara:
sumber