Hati-hati, karena tindakan ini melepaskan SEMUA peristiwa klik, dan tidak selalu perilaku yang diinginkan. Misalnya, saat Anda mengikat sesuatu ke dokumen, Anda ingin melepaskan hanya satu kejadian itu, tidak semuanya.
Mārtiņš Briedis
26
Jika Anda tidak ingin secara tidak sengaja melepaskan peristiwa klik lainnya, Anda mungkin ingin menggunakan function someMethod() { $(obj).off('click.namespace').on('click.namespace', function {}); }
Selain jawaban pna, Anda mungkin ingin memikirkan tentang namespacing acara Anda sehingga Anda tidak terus-menerus melepaskan semua peristiwa klik secara tidak sengaja.
function someMethod () {
$ (obj) .unbind ('click.namespace'). bind ('click.namespace', function () {});
}
Ini harus menjadi jawaban yang diterima. Melepas semua peristiwa klik dapat merusak banyak hal dengan mudah - terutama jika ini adalah proyek yang kompleks dengan banyak jQuery yang sedang berlangsung. Terima kasih untuk itu! Tidak tahu tentang solusi namespace sederhana ini !!
Simon Steinberger
Dengan jQuery saat ini, ini harus $(obj).off()dan $(obj).on()masing - masing. Jika tidak, namespacing membantu dan ini berhasil. Terima kasih!
aexl
19
Tidak ada metode bawaan untuk menentukan apakah Anda telah mengikat fungsi khusus ini. Anda dapat mengikat beberapa fungsi klik ke sebuah objek. Sebagai contoh:
jika Anda melakukan hal di atas saat objek diklik itu akan memberi tahu halo lalu selamat tinggal. Untuk memastikan hanya satu fungsi yang terikat ke peristiwa klik lepaskan penangan peristiwa klik lalu ikat fungsi yang diinginkan seperti ini:
Solusi yang jelas adalah tidak menelepon someMethod()dua kali. Jika Anda tidak dapat memperbaikinya, maka Anda dapat menyimpan variabel status sehingga hanya akan mengikat sekali seperti ini:
function someMethod(){if(!someMethod.bound){
$(obj).click(function(){});
someMethod.bound =true;}}
Catatan: ini menggunakan properti dari fungsi itu sendiri daripada memperkenalkan variabel global untuk melacak apakah itu terikat. Anda juga bisa menggunakan properti pada objek itu sendiri.
Ini hanya akan berfungsi jika someMethod adalah metode objek atau fungsi global.
jcubic
jQuery.noophanya satu karakter lebih pendek dari function(){}, jadi agak konyol mengatakan itu "membantu" di sini, hanya menyediakan fungsi kosong. Berikut adalah contoh non-metode non-jQuery dari solusi umum ini:var fn = function(){ fn = function(){}; do stuff; };
1j01
1
@ 1j01 Diedit untuk digunakan $sebagai gantinya
Esailja
2
Ini saran karena saya tidak tahu logika Anda. Mungkin berhasil atau tidak untuk Anda.
Coba gabungkan fungsi jquery live () dan one () akan memberi Anda hasil yang lebih baik daripada event rebinds.
Kasus khusus berfungsi ketika Anda memiliki 2 elemen DOM (induk & anak). Live () di node induk memastikan acara akan dipanggil, dan kemudian memanggil satu () untuk mendaftarkan acara secara dinamis yang akan dijalankan hanya sekali. (ini menyediakan fungsionalitas serupa seperti rebind).
Perhatikan bahwa ekstensi bekerja dengan memeriksa uid dan type. Ini berarti Anda dapat mengikat berbagai jenis penangan dengan uid yang sama, Anda mungkin menginginkan ini atau tidak. Untuk mengubahnya, edit.
Saya juga mencoba menggunakan metode off and on jquery untuk mengikat event hanya sekali dengan elemen dom yang belum ada atau elemen dom belum dibuat.
Jawaban:
Jika Anda dapat menerapkannya, mungkin ingin melihat event.preventDefault dan event.stopPropagation OR unbind and bind setiap kali, dalam metode Anda seperti
sumber
function someMethod() { $(obj).off('click.namespace').on('click.namespace', function {}); }
Selain jawaban pna, Anda mungkin ingin memikirkan tentang namespacing acara Anda sehingga Anda tidak terus-menerus melepaskan semua peristiwa klik secara tidak sengaja.
https://api.jquery.com/event.namespace/
sumber
$(obj).off()
dan$(obj).on()
masing - masing. Jika tidak, namespacing membantu dan ini berhasil. Terima kasih!Tidak ada metode bawaan untuk menentukan apakah Anda telah mengikat fungsi khusus ini. Anda dapat mengikat beberapa fungsi klik ke sebuah objek. Sebagai contoh:
jika Anda melakukan hal di atas saat objek diklik itu akan memberi tahu halo lalu selamat tinggal. Untuk memastikan hanya satu fungsi yang terikat ke peristiwa klik lepaskan penangan peristiwa klik lalu ikat fungsi yang diinginkan seperti ini:
sumber
Solusi yang jelas adalah tidak menelepon
someMethod()
dua kali. Jika Anda tidak dapat memperbaikinya, maka Anda dapat menyimpan variabel status sehingga hanya akan mengikat sekali seperti ini:Catatan: ini menggunakan properti dari fungsi itu sendiri daripada memperkenalkan variabel global untuk melacak apakah itu terikat. Anda juga bisa menggunakan properti pada objek itu sendiri.
Anda dapat melihatnya bekerja di sini: http://jsfiddle.net/jfriend00/VHkxu/ .
sumber
Atau gunakan fungsi one () jQuery yang mirip dengan on () tetapi hanya mengaktifkan peristiwa sekali, bahkan jika Anda mengikatnya beberapa kali.
http://api.jquery.com/one/
sumber
jQuery memungkinkan pemanggilan beberapa fungsi hanya sekali cukup mudah:
sumber
jQuery.noop
hanya satu karakter lebih pendek darifunction(){}
, jadi agak konyol mengatakan itu "membantu" di sini, hanya menyediakan fungsi kosong. Berikut adalah contoh non-metode non-jQuery dari solusi umum ini:var fn = function(){ fn = function(){}; do stuff; };
$
sebagai gantinyaIni saran karena saya tidak tahu logika Anda. Mungkin berhasil atau tidak untuk Anda.
Coba gabungkan fungsi jquery live () dan one () akan memberi Anda hasil yang lebih baik daripada event rebinds.
Kasus khusus berfungsi ketika Anda memiliki 2 elemen DOM (induk & anak). Live () di node induk memastikan acara akan dipanggil, dan kemudian memanggil satu () untuk mendaftarkan acara secara dinamis yang akan dijalankan hanya sekali. (ini menyediakan fungsionalitas serupa seperti rebind).
sumber
One()
fungsi berfungsichrome
tetapi tidak berfungsisafari
diMac
.Anda dapat menambahkan kelas css ke elemen terikat dan kemudian memfilternya:
Metode ini dapat digunakan juga untuk plugin:
sumber
tapi saya mungkin akan melihat mengapa itu; dipanggil dua kali sebelum membuat beberapa jenis solusi.
sumber
bound
dilampirkansomeMethod()
alih-alih mencemari ruang nama global.Jika Anda ingin mengikat objek hanya sekali, Anda harus mengimplementasikan sebuah bendera dan menempel pada objek itu.
Sebagai contoh:
sumber
Anda dapat menggunakan fungsi ekstensi jQuery ini.
Daripada melakukan ini
Ya lakukan ini
Sekarang ketika saya memiliki fungsi di sekitarnya
Dan saya menyebutnya beberapa kali
Itu hanya melakukannya sekali.
Perhatikan bahwa ekstensi bekerja dengan memeriksa uid dan type. Ini berarti Anda dapat mengikat berbagai jenis penangan dengan uid yang sama, Anda mungkin menginginkan ini atau tidak. Untuk mengubahnya, edit.
var dataStr = type+"-handler-"+uid;
Dengan sesuatu seperti
var dataStr = "handler-"+uid;
sumber
Saya juga mencoba menggunakan metode off and on jquery untuk mengikat event hanya sekali dengan elemen dom yang belum ada atau elemen dom belum dibuat.
Kode ini tidak berfungsi dengan benar
Saya menemukan metode yang sangat menguntungkan yaitu metode 'satu'. Ini sangat berguna jika Anda ingin mengikat acara hanya sekali.
Anda dapat menemukan dokumennya di sini http://api.jquery.com/one/
Ini sama dengan metode 'on' tetapi berbeda dengan perilakunya dengan tidak melekat pada acara untuk banyak pemilih.
sumber
Anda dapat mencapai ini dengan JS murni, menggunakan metode addEventListener dan opsi sekali
sumber