Adalah mungkin untuk menentukan apakah suatu unsur memiliki handler klik, atau perubahan handler, atau segala jenis event handler terikat untuk menggunakan jQuery?
Selain itu, adalah mungkin untuk menentukan berapa banyak klik penangan (atau apapun jenis event handler) itu telah diberikan jenis acara, dan fungsi apa saja yang ada di event handler?
Anda bisa mendapatkan informasi ini dari data cache.
Misalnya, log mereka untuk konsol (firebug, ie8):
console.dir( $('#someElementId').data('events') );
atau iterate mereka:
jQuery.each($('#someElementId').data('events'), function(i, event){
jQuery.each(event, function(i, handler){
console.log( handler.toString() );
});
});
Cara lain adalah anda dapat menggunakan berikut bookmarklet tapi jelas ini tidak membantu pada saat runtime.
Membunuh mengikat ketika itu belum ada adalah bukan solusi terbaik, tapi tampaknya cukup efektif! Kedua kalinya anda 'klik', anda bisa tahu dengan pasti bahwa itu tidak akan membuat duplikat mengikat.
Oleh karena itu saya menggunakan die() atau unbind() seperti ini:
$("#someid").die("click").live("click",function(){...
atau
$("#someid").unbind("click").bind("click",function(){...
atau dalam beberapa versi jQuery:
$("#someid").off("click").on("click",function(){...
Saya menulis sebuah plugin yang disebut hasEventListener yang persis apakah itu :
http://github.com/sebastien-p/jquery.hasEventListener
Semoga ini bisa membantu.
Solusi ini adalah tidak lebih didukung karena jQuery 1.8 seperti yang bisa kita baca di blog berikut ini:
$(elemen).data("event"): Ini adalah sekarang dihapus di 1.8, tetapi anda masih bisa mendapatkan peristiwa data untuk keperluan debugging melalui $._data(elemen, "peristiwa"). Perhatikan bahwa ini adalah tidak didukung antarmuka publik; data aktual struktur dapat berubah secara tidak kompatibel dari versi ke versi.
Jadi, anda harus melepaskan/rebind itu atau hanya, menggunakan boolean untuk menentukan apakah acara anda seperti yang telah terpasang atau tidak (yang menurut saya solusi terbaik).
Saya menulis sangat kecil plugin yang disebut "sekali" yang melakukannya:
$.fn.once = function(a, b) {
return this.each(function() {
$(this).off(a).on(a,b);
});
};
Dan hanya:
$(element).once('click', function(){
});
Saya don't berpikir bahwa hasEventListener plugin disebutkan akan menangani acara khusus misalnya
var obj = {id:'test'};
$(obj).bind('custom', function(){
alert('custom');
}).trigger('custom');
alert($(obj).hasEventListener('custom'));
Juga, setidaknya dalam jQuery 1.5 saya pikir anda harus berhati-hati menggunakan $(target).data('acara') karena keuntungan yang berbeda untuk acara-acara yang telah terikat dengan benda-benda seperti di atas.
Anda perlu melakukan sesuatu seperti:
var events = $(target).data("events");
if(typeof events === "function"){
events = events.events;
}
Saya menggunakan pendekatan semacam ini dan bekerja tapi rasanya sedikit seperti saya pada belas kasihan dari jquery internal dan yang benar-benar seharusnya aku't harus melakukan itu!
Aku punya kebutuhan yang sama & cepat ditambal kode yang ada untuk dapat melakukan sesuatu seperti ini:
if( $('.scroll').hasHandlers('mouseout') ) // could be click, or '*'...
{
... code ..
}
Ia bekerja untuk acara delegasi juga:
if ( $('#main').hasHandlers('click','.simple-search') ) ...
Ini tersedia di sini : jquery-handler-toolkit.js
Dengan mengacu DANGSTARS's jawaban dan dari W3Schools.com
Sebagai jQuery versi 1.7, off() metode ini baru pengganti unbind(), die() dan undelegate() metode. Metode ini membawa banyak konsistensi untuk API, dan kami merekomendasikan bahwa anda menggunakan metode ini, karena menyederhanakan kode jQuery dasar.
Hal ini memberikan:
$("#someid").off("click").live("click",function(){...
atau
$("#someid").off("click").bind("click",function(){...