Saya telah membaca dokumentasi masing-masing fungsi jQuery official website
, tetapi tidak ada daftar perbandingan antara fungsi-fungsi di bawah ini:
$().click(fn)
$().bind('click',fn)
$().live('click',fn)
$().delegate(selector, 'click', fn)
$().trigger('click') // UPDATED
$().on('click', selector ,fn); // more UPDATED
Harap hindari tautan referensi apa pun.
Bagaimana semua fungsi di atas berfungsi dengan baik dan mana yang lebih disukai dalam situasi apa?
Catatan: Jika ada fungsi lain yang memiliki fungsionalitas atau mekanisme yang sama, Maka jelaskan.
Memperbarui
Saya juga melihat $.trigger
fungsi. Apakah fungsinya mirip dengan fungsi di atas?
Lebih Banyak Pembaruan
Sekarang .on
ditambahkan dalam v1.7 dan saya pikir ini entah bagaimana mencakup semua persyaratan fungsi di atas bersama-sama.
javascript
jquery
diEcho
sumber
sumber
.live()
dan.delegate()
hampir setiap hari, +1 untuk pertanyaan yang benar-benar valid.SO
. atau itu baru saja datang dari pengalaman.trigger()
aktifkan event handler ... Saya akan menambahkan deskripsi ke jawaban saya di bawah ini.Jawaban:
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: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: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: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: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 suatufocus
peristiwa 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:
Ini akan menjalankan penangan kirim apa pun, misalnya plugin validasi jQuery , lalu coba kirim
<form>
. Namun jika Anda hanya ingin memvalidasi, karena terhubung melaluisubmit
event handler, tetapi tidak mengirimkan<form>
setelahnya, Anda dapat menggunakan.triggerHandler('submit')
, seperti ini: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)sumber
trigger
tidak memecat acara asli. Maksud saya maksud suatu peristiwa disimulasikan denganfireEvent
(IE) ataudispatchEvent
(w3c).live()
berbeda dari yang Anda berikan di sini: stackoverflow.com/questions/3981762/... Apakah 'berat' masih menjadi perhatian saat digunakanlive()
?.live()
panggilan Anda mendengarkan, misalnyaclick
) yang sedang dihasilkan, karena itu menjalankan penyeleksi untuk masing-masing.Dua yang pertama adalah setara.
Namun, yang kedua dapat digunakan untuk mengikat lebih dari satu peristiwa pada saat yang sama, dengan menetapkan beberapa nama peristiwa yang dipisahkan oleh ruang:
The
.live
Metode ini lebih menarik. Perhatikan contoh berikut:Setelah baris kedua skrip dijalankan, tautan kedua juga akan memiliki kelas CSS "myLink". Tapi itu tidak akan memiliki pengendali acara, karena tidak memiliki kelas ketika acara itu dilampirkan.
Sekarang anggap Anda ingin sebaliknya: setiap kali tautan dengan kelas "myLink" muncul di suatu tempat di halaman, Anda ingin memiliki pengendali acara yang sama secara otomatis. Ini sangat umum ketika Anda memiliki beberapa jenis daftar atau tabel, di mana Anda menambahkan baris atau sel secara dinamis, tetapi ingin semuanya berperilaku dengan cara yang sama. Alih-alih pergi kesusahan menetapkan penangan acara yang baru setiap kali, Anda dapat menggunakan
.live
metode ini:Dalam contoh ini, tautan kedua juga akan mendapatkan pengendali acara segera setelah mendapat kelas "myLink". Sihir! :-)
Tentu saja, itu tidak literal. Apa yang
.live
sebenarnya dilakukan adalah melampirkan handler bukan ke elemen yang ditentukan itu sendiri, tetapi ke akar dari pohon HTML (elemen "body"). Acara di DHTML memiliki fitur lucu "menggelegak". Pertimbangkan ini:Jika Anda mengklik "teks", maka pertama elemen <b> akan mendapatkan acara "klik". Setelah itu, elemen <a> akan mendapatkan acara "klik". Dan setelah itu elemen <div> akan mendapatkan acara "klik". Dan seterusnya - sampai ke elemen <body>. Dan di situlah jQuery akan menangkap acara dan melihat apakah ada penangan "langsung" yang berlaku untuk elemen yang menyebabkan acara di tempat pertama. Rapi!
Dan akhirnya,
.delegate
metodenya. Ini hanya membawa semua anak-anak elemen Anda yang sesuai dengan pemilih yang diberikan dan melampirkan pawang "hidup" kepada mereka. Lihatlah:Pertanyaan?
sumber
.live()
mengikat kedocument
tidak<body>
:) Anda dapat melihat demo di sini, cukup tarik konsol untuk memeriksa: jsfiddle.net/aJy2B.live()
tinggal penangan, itu di atas itu, padadocument
:) Anda dapat melihat demo dari ini di sini: jsfiddle.net/S2VBXPada jQuery 1.7, metode .live () sudah tidak digunakan lagi. Jika Anda menggunakan versi jQuery <1.7 daripada yang disarankan untuk menggunakan .delegate () di atas .live ().
.live () sekarang telah diganti dengan .on ().
Cara terbaik untuk langsung menuju ke situs jQuery untuk informasi lebih lanjut, tetapi berikut adalah versi terbaru dari metode .on ():
http://api.jquery.com/on/
sumber
$().click(fn)
dan$().bind('click', fn)
identik pada pandangan pertama, tetapi$.bind
versi ini lebih kuat karena dua alasan:$().bind()
memungkinkan Anda untuk menetapkan satu penangan ke beberapa acara, misalnya,$().bind('click keyup', fn)
,.$().bind()
mendukung acara dengan spasi nama - fitur hebat jika Anda ingin menghapus (melepaskan ikatan) hanya event handler tertentu yang terikat dengan elemen - baca lebih lanjut di Acara dengan Nama .Live vs delegate: ini sudah dijawab di balasan yang lain.
sumber
Di sinilah membaca API dapat membantu. Namun, saya tahu dari atas kepala saya, sehingga Anda dapat terus menjadi malas (yay!).
Tidak ada perbedaan di sini (yang saya tahu).
.click
hanyalah metode kenyamanan / penolong bagi.bind('click'
Ini sangat berbeda, karena
.live
menambahkan acara ke pemilih yang Anda lewati (yang belum Anda datangi) dan terus melihat DOM saat simpul dimasukkan / dihapusIni hanya berbeda karena cara Anda menugaskan penangan acara.
.delegate
dipusatkan pada acara DOM yang menggelegak. Prinsip dasarnya adalah bahwa setiap peristiwa meluap ke atas melalui pohon DOM hingga mencapai elemen root (document
atauwindow
atau<html>
atau<body>
, saya tidak ingat persis).Either way, Anda mengikat
onclick
pawang ke semua yang ada<td>
di dalam$('#some_element')
(Anda harus menentukan pemilih, meskipun Anda bisa mengatakan$(document)
). Ketika salah satu anaknya diklik, acara akan muncul hingga<td>
. Anda kemudian dapat mengekstrak elemen sumber acara (yang jQuery lakukan untuk Anda secara otomatis).Ini berguna ketika ada banyak elemen dan Anda hanya memiliki hanya beberapa (atau satu titik pusat) yang akan dilalui oleh peristiwa ini. Ini menghemat upaya browser dan memori untuk mengkonsolidasikan penangan acara ini menjadi lebih sedikit objek.
sumber
.live()
juga bekerja dari acara menggelegak, sebenarnya.delegate()
adalah pembungkus untuk.live()
, itu hanya menambahkan konteks dan mengikat unsur lain selaindocument
untuk menangkap gelembung. Saya pikir pemahaman Anda tentang bagaimana cara kerja penangan yang menggelegak sedikit (ini adalah aspek yang paling sering disalahpahami dari jQuery 1.4 saya pikir). Pawang hanya pada elemen tempat Anda mengikatnya, jadi elemen apa pun yang Anda panggil.delegate()
, ataudocument
dalam hal.live()
, ketika suatu peristiwa meletus ke sana, ia memeriksa target untuk melihat apakah itu cocok dengan pemilih, dan jika demikian dijalankan.