Saya ingin menambahkan beberapa komentar dan argumen balasan untuk jawaban jfriend00. (Sebagian besar hanya pendapat saya berdasarkan perasaan saya)
Tidak - Anda TIDAK boleh mengikat semua penangan acara yang didelegasikan ke objek dokumen. Itu mungkin skenario berkinerja terburuk yang bisa Anda buat.
Pertama, delegasi acara tidak selalu membuat kode Anda lebih cepat. Dalam beberapa kasus, ini menguntungkan dan dalam beberapa kasus tidak. Anda harus menggunakan delegasi acara ketika Anda benar-benar membutuhkan delegasi acara dan ketika Anda mendapat manfaat darinya. Jika tidak, Anda harus mengikat penangan acara langsung ke objek tempat acara terjadi karena ini umumnya akan lebih efisien.
Meskipun benar bahwa kinerja mungkin sedikit lebih baik jika Anda hanya akan mendaftar dan mengadakan satu elemen, saya percaya itu tidak membebani manfaat skalabilitas yang dibawa oleh delegasi. Saya juga percaya browser akan menangani ini lebih dan lebih efisien, meskipun saya tidak punya bukti tentang ini. Menurut pendapat saya, delegasi acara adalah jalan yang harus dilalui!
Kedua, Anda TIDAK boleh mengikat semua acara yang didelegasikan di tingkat dokumen. Inilah sebabnya mengapa .live () tidak digunakan lagi karena ini sangat tidak efisien ketika Anda memiliki banyak acara yang terikat dengan cara ini. Untuk penanganan acara yang didelegasikan, JAUH lebih efisien untuk mengikat mereka ke induk terdekat yang tidak dinamis.
Saya agak setuju dengan ini. Jika Anda 100% yakin bahwa suatu peristiwa hanya akan terjadi di dalam wadah, masuk akal untuk mengikat acara ke wadah ini, tapi saya masih akan berdebat menentang acara mengikat ke elemen pemicu secara langsung.
Ketiga, tidak semua acara bekerja atau semua masalah dapat diselesaikan dengan delegasi. Misalnya, jika Anda ingin mencegat peristiwa utama pada kontrol input dan memblokir kunci yang tidak valid agar tidak dimasukkan ke dalam kontrol input, Anda tidak dapat melakukan itu dengan penanganan acara yang didelegasikan karena pada saat acara muncul hingga penangan yang didelegasikan, itu sudah telah diproses oleh kontrol input dan sudah terlambat untuk mempengaruhi perilaku itu.
Ini tidak benar. Silakan lihat kode iniPen: https://codepen.io/pwkip/pen/jObGmjq
document.addEventListener('keypress', (e) => {
e.preventDefault();
});
Ini menggambarkan bagaimana Anda dapat mencegah pengguna mengetik dengan mendaftarkan acara penekanan tombol pada dokumen.
Inilah saat-saat ketika delegasi acara diperlukan atau menguntungkan:
Ketika objek yang Anda tangkap peristiwa secara dinamis dibuat / dihapus dan Anda masih ingin menangkap peristiwa pada mereka tanpa harus secara eksplisit me-rebind event handler setiap kali Anda membuat yang baru. Ketika Anda memiliki banyak objek yang semuanya ingin penangan event yang sama persis (di mana banyak setidaknya ratusan). Dalam hal ini, mungkin lebih efisien pada waktu pemasangan untuk mengikat satu pengendali acara yang didelegasikan daripada ratusan atau lebih penangan acara langsung. Catatan, penanganan acara yang didelegasikan selalu kurang efisien pada waktu berjalan dibandingkan penangan acara langsung.
Saya ingin membalas dengan kutipan ini dari https://ehsangazar.com/optimizing-javascript-event-listeners-for-performance-e28406ad406c
Event delegation promotes binding as few DOM event handlers as possible, since each event handler requires memory. For example, let’s say that we have an HTML unordered list we want to bind event handlers to. Instead of binding a click event handler for each list item (which may be hundreds for all we know), we bind one click handler to the parent unordered list itself.
Juga, googling untuk performance cost of event delegation google
mengembalikan hasil lebih banyak dalam mendukung delegasi acara.
Saat Anda mencoba menangkap (pada level yang lebih tinggi dalam dokumen Anda) peristiwa yang terjadi pada elemen apa pun dalam dokumen. Saat desain Anda secara eksplisit menggunakan event bubbling dan stopPropagation () untuk menyelesaikan beberapa masalah atau fitur di halaman Anda. Untuk memahami ini sedikit lagi, orang perlu memahami bagaimana penangan event yang didelegasikan jQuery bekerja. Ketika Anda memanggil sesuatu seperti ini:
$ ("# myParent"). on ('klik', 'button.actionButton', myFn); Itu menginstal pengendali event jQuery generik pada objek #myParent. Ketika sebuah event klik muncul hingga pengendali event yang didelegasikan ini, jQuery harus melihat daftar handler event yang didelegasikan yang dilampirkan pada objek ini dan melihat apakah elemen yang berasal dari event tersebut cocok dengan salah satu pemilih dalam handler event yang didelegasikan.
Karena penyeleksi dapat terlibat secara adil, ini berarti bahwa jQuery harus mengurai setiap pemilih dan kemudian membandingkannya dengan karakteristik target acara asli untuk melihat apakah itu cocok dengan setiap pemilih. Ini bukan operasi yang murah. Bukan masalah besar jika hanya ada satu di antara mereka, tetapi jika Anda menempatkan semua penyeleksi Anda pada objek dokumen dan ada ratusan penyeleksi untuk dibandingkan dengan setiap peristiwa yang menggelegak, ini secara serius dapat mulai menghambat kinerja penanganan acara.
Untuk alasan ini, Anda ingin mengatur penangan acara yang didelegasikan Anda sehingga penangan acara yang didelegasikan sedekat mungkin dengan objek target. Ini berarti bahwa lebih sedikit acara akan muncul melalui masing-masing pengendali acara yang didelegasikan, sehingga meningkatkan kinerja. Menempatkan semua acara yang didelegasikan pada objek dokumen adalah kinerja yang paling buruk karena semua acara yang digelembungkan harus melalui semua penangan acara yang didelegasikan dan dievaluasi terhadap semua penyeleksi acara yang mungkin didelegasikan. Inilah sebabnya mengapa .live () tidak digunakan lagi karena inilah yang .live () lakukan dan terbukti sangat tidak efisien.
Di mana ini didokumentasikan? Jika itu benar, maka jQuery tampaknya menangani delegasi dengan cara yang sangat tidak efisien, dan kemudian argumen-argumen saya seharusnya hanya diterapkan pada vanilla JS.
Namun: Saya ingin mencari sumber resmi yang mendukung klaim ini.
:: EDIT ::
Sepertinya jQuery memang melakukan peristiwa yang menggelegak dengan cara yang sangat tidak efisien (karena mereka mendukung IE8)
https://api.jquery.com/on/#event-performance
Jadi sebagian besar argumen saya di sini hanya berlaku untuk vanilla JS dan browser modern.