Saya ingin mengadakan acara sampai saya siap untuk memecatnya misalnya
$('.button').live('click', function(e){
e.preventDefault();
// do lots of stuff
e.run() //this proceeds with the normal event
}
Apakah ada yang setara dengan run()
fungsi yang dijelaskan di atas?
jquery
jquery-events
Mazatec
sumber
sumber
Jawaban:
Nggak. Setelah acara dibatalkan, dibatalkan.
Anda dapat memecat kembali acara nanti, menggunakan bendera untuk menentukan apakah kode khusus Anda sudah berjalan atau belum - seperti ini (harap abaikan polusi namespace terang-terangan):
Varian yang lebih umum (dengan manfaat tambahan untuk menghindari polusi namespace global) dapat menjadi:
Pemakaian:
Plugin jQuery bonus super-minimalis dengan
Promise
dukungan:Pemakaian:
sumber
lots_of_stuff_already_done = true;
benderanya - jika tidak, tidak ada cara agar fungsi tetap berulang.Versi terbaru dari jawaban yang diterima.
Versi singkat:
Kasus penggunaan yang baik untuk sesuatu seperti ini adalah di mana Anda mungkin memiliki beberapa kode formulir lawas yang berfungsi, tetapi Anda diminta untuk meningkatkan formulir dengan menambahkan sesuatu seperti validasi alamat email sebelum mengirimkan formulir. Alih-alih menggali melalui kode pos formulir back-end, Anda bisa menulis API dan kemudian memperbarui kode front-end Anda untuk menekan API itu terlebih dahulu sebelum mengizinkan formulir untuk melakukan itu POST tradisional.
Untuk melakukan itu, Anda dapat menerapkan kode yang mirip dengan yang saya tulis di sini:
sumber
Anda dapat melakukan sesuatu seperti
sumber
Ganti properti
isDefaultPrevented
seperti ini:IMHO, ini adalah cara paling lengkap untuk retriggering acara dengan data yang persis sama.
sumber
e
tidak terdefinisi. seharusnyaevt.preventDefault()
. Saya mencoba mengedit, tetapi suntingan saya harus> 6 karakter dan saya baru saja menambahkan 2 :(event.isPropagationStopped = function(){ return false; };
. Saya juga menambahkan properti khusus ke acara sehingga saya bisa mendeteksi di handler jika cek yang mencegah tindakan dilakukan sehingga tidak dibuat lagi. Bagus!Hal ini dimungkinkan untuk menggunakan
currentTarget
satuevent
. Contoh menunjukkan bagaimana melanjutkan dengan mengirimkan formulir. Anda juga bisa mendapatkan fungsi darionclick
atribut dll.sumber
submit()
elemen yang sama, apakah Anda tidak akan mengembalikan kode `` $ ('form'). on ('submit') Anda dan mengulanginya lagi dan lagi?Hanya saja jangan melakukan
e.preventDefault();
, atau melakukannya secara kondisional.Anda tentu tidak dapat mengubah ketika tindakan peristiwa asli terjadi.
Jika Anda ingin "membuat ulang" acara UI asli beberapa waktu kemudian (katakanlah, dalam panggilan balik untuk permintaan AJAX) maka Anda hanya perlu memalsunya dengan cara lain (seperti dalam jawaban vzwick) ... meskipun saya akan mempertanyakan kegunaan dari pendekatan semacam itu.
sumber
Jawaban yang lebih baru digunakan dengan terampil
jQuery.one()
https://stackoverflow.com/a/41440902/510905
sumber
selama "banyak hal" tidak melakukan sesuatu yang tidak sinkron, ini sama sekali tidak perlu - acara akan memanggil setiap penangan secara berurutan, jadi jika ada acara onklick pada elemen induk, ini akan diaktifkan setelah onclik- Peristiwa anak telah diproses sepenuhnya. javascript tidak melakukan semacam "multithreading" di sini yang membuat "menghentikan" peristiwa yang diperlukan neccessary. Kesimpulan: "menjeda" suatu peristiwa hanya untuk melanjutkannya di penangan yang sama tidak masuk akal.
jika "banyak hal" adalah sesuatu yang tidak sinkron, ini juga tidak masuk akal karena mencegah hal-hal yang tidak sinkron untuk melakukan apa yang seharusnya mereka lakukan (hal-hal yang tidak sinkron) dan menjadikannya bahave seperti segala sesuatunya berurutan (di mana kita kembali ke paragraf pertama saya) )
sumber
async
-fag: api.jquery.com/jQuery.ajax ) ... tetapi membuat sinkron-ajax-permintaan adalah ide buruk di hampir setiap kasus, jadi akan lebih baik untuk menemukan solusi yang berbeda.Pendekatan yang saya gunakan adalah ini:
sumber
Solusi yang diterima tidak akan berfungsi jika Anda bekerja dengan tag anchor. Dalam hal ini Anda tidak akan dapat mengklik tautan lagi setelah menelepon
e.preventDefault()
. Itu karena acara klik yang dihasilkan oleh jQuery hanya lapisan di atas acara browser asli. Jadi memicu acara 'klik' pada tag jangkar tidak akan mengikuti tautan. Alih-alih, Anda bisa menggunakan pustaka seperti simulasi-jquery yang memungkinkan Anda meluncurkan acara browser asli.Rincian lebih lanjut tentang ini dapat ditemukan di tautan ini
sumber
Solusi lain adalah dengan menggunakan window.setTimeout di pendengar acara dan jalankan kode setelah proses acara selesai. Sesuatu seperti...
sumber
Saya tahu topik ini sudah lama tetapi saya pikir saya bisa berkontribusi. Anda dapat memicu perilaku default suatu peristiwa pada elemen tertentu kapan saja dalam fungsi penangan Anda jika Anda sudah tahu perilaku itu. Misalnya, ketika Anda memicu acara klik pada tombol reset, Anda benar-benar memanggil fungsi reset pada formulir terdekat sebagai perilaku default. Dalam fungsi handler Anda, setelah menggunakan fungsi preventDefault, Anda dapat memanggil kembali perilaku default dengan memanggil fungsi reset pada formulir terdekat di mana saja dalam kode handler Anda.
sumber
Jika contoh ini dapat membantu, tambahkan "kustom konfirmasi popin" pada beberapa tautan (saya menyimpan kode "$ .ui.Modal.confirm", itu hanya contoh untuk panggilan balik yang menjalankan tindakan asli):
sumber