Sebelum Anda membaca ini, tarik daftar acara ini di halaman lain, API itu sendiri sangat membantu, dan semua yang saya diskusikan di bawah ini terhubung langsung dari halaman ini .
Pertama, .click(function)secara harfiah merupakan jalan pintas untuk .bind('click', function), mereka setara. Gunakan mereka ketika mengikat pawang langsung ke suatu elemen , seperti ini:
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
Jika elemen ini diganti atau dibuang, pawang ini tidak akan ada lagi. Juga elemen-elemen yang tidak ada ketika kode ini dijalankan untuk melampirkan handler (mis. Pemilih menemukannya kemudian) tidak akan mendapatkan handler.
.live()dan .delegate()sama-sama terkait, .delegate()benar-benar menggunakan .live()internal, mereka berdua mendengarkan acara menggelembung. Ini berfungsi untuk elemen baru dan lama , mereka menggelembungkan acara dengan cara yang sama. Anda menggunakan ini ketika elemen Anda dapat berubah, misalnya menambahkan baris baru, daftar item, dll. Jika Anda tidak memiliki orang tua / leluhur umum yang akan tetap berada di halaman dan tidak diganti pada titik mana pun, gunakan .live(), seperti ini:
$(".clickAlert").live('click', function() {
alert("A click happened");
});
Namun jika Anda memiliki elemen induk di suatu tempat yang tidak diganti (jadi penangan eventnya tidak akan selamat tinggal) Anda harus menanganinya .delegate(), seperti ini:
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
Ini berfungsi hampir sama dengan .live(), tetapi peristiwa itu lebih sedikit meluap sebelum ditangkap dan penangan dieksekusi. Penggunaan umum kedua dari ini adalah mengatakan perubahan kelas Anda pada suatu elemen, tidak lagi cocok dengan pemilih yang Anda gunakan ... dengan metode ini pemilih dievaluasi pada saat acara , jika cocok, pawang berjalan .. . jadi elemen tidak lagi cocok dengan masalah pemilih, itu tidak akan dijalankan lagi. Dengan .click()Namun, event handler adalah terikat tepat pada elemen DOM, fakta bahwa itu tidak cocok pemilih apa pun yang digunakan untuk menemukan itu tidak relevan ... acara terikat dan itu tinggal sampai elemen yang hilang, atau pawang dihapus melalui .unbind().
Namun yang umum digunakan untuk .live()dan .delegate()adalah kinerja . Jika Anda berurusan dengan banyak elemen, melampirkan handler klik langsung ke setiap elemen itu mahal dan memakan waktu. Dalam kasus ini, lebih ekonomis untuk mengatur handler tunggal dan membiarkannya bekerja, lihat pertanyaan ini di mana ia membuat perbedaan besar , itu adalah contoh aplikasi yang bagus.
Memicu - untuk pertanyaan yang diperbarui
Ada 2 fungsi pemicu event-handler utama yang tersedia, mereka termasuk dalam kategori "Event Handler Attachment" yang sama di API , ini adalah .trigger()dan .triggerHandler(). .trigger('eventName')memiliki beberapa pintasan bawaan untuk acara umum, misalnya:
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
Anda dapat melihat daftar termasuk pintasan ini di sini .
Adapun perbedaannya, .trigger()memicu event handler (tetapi bukan tindakan default sebagian besar waktu, misalnya menempatkan kursor di tempat yang tepat di klik <textarea>). Hal ini menyebabkan event handler terjadi sesuai dengan urutan mereka terikat (seperti acara asli), menembakkan aksi event asli, dan menggembungkan DOM.
.triggerHandler()biasanya untuk tujuan yang berbeda, di sini Anda hanya mencoba memecat pawang yang terikat, itu tidak menyebabkan acara asli menyala, misalnya mengirimkan formulir. Itu tidak menggembungkan DOM, dan itu tidak dapat dilepas (mengembalikan apa pun yang ditangani pengendali acara terakhir untuk acara itu kembali). Misalnya jika Anda ingin memicu suatu focusperistiwa tetapi tidak benar-benar fokus objek, Anda hanya ingin kode Anda terikat .focus(fn)untuk menjalankan, ini akan melakukan itu, sedangkan .trigger()akan melakukannya serta benar-benar fokus elemen dan menggelembung ke atas.
Ini adalah contoh dunia nyata:
$("form").submit(); //actually calling `.trigger('submit');`
Ini akan menjalankan penangan kirim apa pun, misalnya plugin validasi jQuery , lalu coba kirim <form>. Namun jika Anda hanya ingin memvalidasi, karena terhubung melalui submitevent handler, tetapi tidak mengirimkan <form>setelahnya, Anda dapat menggunakan .triggerHandler('submit'), seperti ini:
$("form").triggerHandler('submit');
Plugin mencegah pawang mengirimkan formulir dengan membom keluar jika pemeriksaan validasi tidak lulus, tetapi dengan metode ini kami tidak peduli apa fungsinya. Apakah itu dibatalkan atau tidak, kami tidak mencoba mengirimkan formulir, kami hanya ingin memicunya untuk memvalidasi ulang dan tidak melakukan hal lain. ( Penafian: Ini adalah contoh berlebihan karena ada .validate()metode di plugin, tapi ini ilustrasi maksud yang baik)