Katakanlah saya memiliki aplikasi web yang memiliki halaman yang mungkin berisi 4 blok skrip - skrip yang saya tulis dapat ditemukan di salah satu blok itu, tetapi saya tidak tahu yang mana, yang ditangani oleh pengontrol.
Saya mengikat beberapa onclick
acara ke tombol, tetapi saya menemukan bahwa mereka kadang-kadang mengeksekusi dalam urutan yang tidak saya harapkan.
Apakah ada cara untuk memastikan pesanan, atau bagaimana Anda menangani masalah ini di masa lalu?
javascript
jquery
events
mkoryak
sumber
sumber
Jawaban:
Saya telah berusaha selama bertahun-tahun untuk menggeneralisasi proses semacam ini, tetapi dalam kasus saya, saya hanya peduli dengan urutan pendengar acara pertama dalam rantai.
Jika ada gunanya, berikut ini adalah plugin jQuery saya yang mengikat pendengar acara yang selalu dipicu sebelum yang lain:
** DIPERBARUI sejalan dengan perubahan jQuery (terima kasih Toskan) **
Hal yang perlu diperhatikan:
sumber
this.data("events")
, lihat di sini stackoverflow.com/questions/12214654/…Jika pesanan penting, Anda dapat membuat acara Anda sendiri dan mengikat panggilan balik ke api ketika peristiwa itu dipicu oleh panggilan balik lainnya.
Setidaknya sesuatu seperti itu.
sumber
Metode Dowski bagus jika semua panggilan balik Anda akan selalu ada dan Anda senang mereka saling bergantung.
Namun, jika Anda ingin panggilan balik itu tidak tergantung satu sama lain, Anda dapat memanfaatkan penggelembungan dan melampirkan peristiwa selanjutnya sebagai delegasi ke elemen induk. Penangan pada elemen induk akan dipicu setelah penangan pada elemen, terus sampai ke dokumen. Ini cukup baik karena Anda dapat menggunakan
event.stopPropagation()
,event.preventDefault()
, dll untuk melewatkan penangan dan membatalkan atau un-membatalkan tindakan.Atau, jika Anda tidak suka ini, Anda bisa menggunakan plugin Nick Leaches bindLast untuk memaksa suatu acara terikat terakhir: https://github.com/nickyleach/jQuery.bindLast .
Atau, jika Anda menggunakan jQuery 1.5, Anda juga bisa berpotensi melakukan sesuatu yang pintar dengan objek Ditangguhkan baru.
sumber
.delegate
tidak digunakan lagi dan sekarang Anda harus menggunakan.on
, namun saya tidak tahu bagaimana Anda dapat mencapai perilaku yang sama denganon
Urutan panggilan balik terikat ini dikelola oleh data acara masing-masing objek jQuery. Tidak ada fungsi apa pun (yang saya ketahui) yang memungkinkan Anda untuk melihat dan memanipulasi data secara langsung, Anda hanya dapat menggunakan bind () dan unbind () (atau fungsi pembantu yang setara).
Metode Dowski adalah yang terbaik, Anda harus memodifikasi berbagai panggilan balik terikat untuk mengikat urutan acara kustom, dengan panggilan balik "pertama" terikat ke acara "nyata". Dengan begitu, tidak peduli dalam urutan apa mereka terikat, urutannya akan dijalankan dengan cara yang benar.
Satu-satunya alternatif yang bisa saya lihat adalah sesuatu yang Anda benar-benar tidak ingin renungkan: jika Anda tahu sintaks mengikat dari fungsi-fungsi tersebut mungkin telah terikat di depan Anda, cobalah untuk melepaskan ikatan semua fungsi-fungsi itu dan kemudian mengikatnya kembali dalam urutan yang tepat sendiri. Itu hanya meminta masalah, karena sekarang Anda memiliki kode duplikasi
Akan keren jika jQuery memungkinkan Anda untuk hanya mengubah urutan peristiwa terikat dalam data acara objek, tetapi tanpa menulis beberapa kode untuk menghubungkan ke inti jQuery yang sepertinya tidak mungkin. Dan mungkin ada implikasi dari membiarkan ini yang belum saya pikirkan, jadi mungkin itu adalah kelalaian yang disengaja.
sumber
Harap dicatat bahwa di jQuery universe ini harus diimplementasikan secara berbeda pada versi 1.8. Catatan rilis berikut ini dari blog jQuery:
Kami memiliki kendali penuh atas urutan yang akan dieksekusi oleh penangan di jQuery universe . Ricoo menunjukkan ini di atas. Sepertinya jawabannya tidak membuatnya mendapatkan banyak cinta, tetapi teknik ini sangat berguna. Pertimbangkan, misalnya, kapan saja Anda perlu menjalankan handler Anda sendiri sebelum melakukan handler di widget library, atau Anda harus memiliki kekuatan untuk membatalkan panggilan ke handler widget secara kondisional:
sumber
hanya mengikat handler secara normal dan kemudian jalankan:
jadi misalnya:
sumber
$._data(element, 'events')[name].reverse()
berhasilsumber
Anda dapat mencoba sesuatu seperti ini:
sumber
Saya memiliki masalah yang sama dan menemukan topik ini. jawaban di atas dapat menyelesaikan masalah tersebut, tetapi saya rasa itu bukan rencana yang bagus.
mari kita berpikir tentang dunia nyata.
jika kita menggunakan jawaban itu, kita harus mengubah kode kita. Anda harus mengubah gaya kode Anda. sesuatu seperti ini:
asli:
retas:
seiring berjalannya waktu, pikirkan proyek Anda. kodenya jelek dan sulit dibaca! alasan anthoer sederhana selalu lebih baik. jika Anda memiliki 10 bindAtTheStart, mungkin tidak ada bug. jika Anda memiliki 100 bindAtTheStart, apakah Anda yakin dapat menyimpannya dengan benar?
jadi jika Anda harus mengikat beberapa acara yang sama. Saya pikir cara terbaik adalah mengontrol js-file atau js-code load order. jquery dapat menangani data acara sebagai antrian. urutannya adalah masuk pertama, keluar pertama. Anda tidak perlu mengubah kode apa pun. cukup ubah urutan muat.
sumber
Inilah kesempatan saya untuk ini, mencakup berbagai versi jQuery:
sumber
Dalam beberapa kasus khusus, ketika Anda tidak dapat mengubah bagaimana acara klik diikat (binding acara dibuat dari kode orang lain), dan Anda dapat mengubah elemen HTML, berikut adalah solusi yang mungkin ( peringatan : ini bukan cara yang disarankan untuk mengikat peristiwa, pengembang lain dapat membunuh Anda untuk ini):
Dengan cara pengikatan ini, event hander Anda akan ditambahkan terlebih dahulu, sehingga akan dieksekusi terlebih dahulu.
sumber
JQuery 1.5 memperkenalkan janji, dan inilah implementasi paling sederhana yang saya lihat untuk mengontrol urutan eksekusi. Dokumentasi lengkap di http://api.jquery.com/jquery.when/
sumber