Di jQuery v1.7 metode baru, on
ditambahkan. Dari dokumentasi:
'Metode .on () melampirkan penangan acara ke set elemen yang dipilih saat ini di objek jQuery. Pada jQuery 1.7, metode .on () menyediakan semua fungsi yang diperlukan untuk melampirkan penangan acara. '
Apa bedanya dengan live
dan bind
?
Jawaban:
on()
adalah upaya untuk menggabungkan sebagian besar fungsi pengikatan acara jQuery menjadi satu. Ini memiliki bonus tambahan merapikan inefisiensi denganlive
vsdelegate
. Dalam versi jQuery yang akan datang, metode ini akan dihapus dan hanyaon
danone
akan ditinggalkan.Contoh:
Secara internal, jQuery memetakan semua metode ini dan steno pengendali event handler ke
on()
metode, lebih lanjut menunjukkan bahwa Anda harus mengabaikan metode ini dari sekarang dan cukup gunakanon
:Lihat https://github.com/jquery/jquery/blob/1.7/src/event.js#L965 .
sumber
$(document.body).delegate("click", ".mySelector", fn);
seharusnya$(document.body).delegate(".mySelector", "click", fn);
on
di alam sangat dekatdelegate
. Jadi mengapa tidak menggunakan delegasi? Itu karenaon
tidak datang sendiri. adaoff
, untuk melepaskan ikatan acara danone
membuat acara yang akan dieksekusi satu kali saja. Ini adalah "paket" acara baru.Masalah utama
live
adalah bahwa ia menempel pada "jendela", memaksa acara klik (atau acara lainnya) pada elemen jauh di dalam struktur halaman (dom), untuk "melambung" ke bagian atas halaman untuk menemukan acara pawang bersedia menghadapinya. Di setiap level, semua penangan acara harus diperiksa, ini dapat bertambah dengan cepat, jika Anda melakukan pelafalan mendalam (<body><div><div><div><div><table><table><tbody><tr><td><div><div><div><ul><li><button> etc etc etc...
)Jadi,
bind
seperticlick
, seperti pengikat acara pintasan lainnya, lampirkan langsung ke target acara. Jika Anda memiliki tabel, katakanlah, 1000 baris dan 100 kolom, dan masing-masing sel 100'000 menyertakan kotak centang yang klik yang ingin Anda tangani. Melampirkan 100'000 penangan acara akan membutuhkan banyak waktu pada pemuatan halaman. Membuat satu acara di tingkat tabel, dan menggunakan delegasi acara adalah beberapa urutan besarnya lebih efisien. Target acara akan diambil pada waktu pelaksanaan acara. "this
" akan menjadi tabel, "event.target
" tapi akan menjadi "this
" biasa Anda dalam suatuclick
fungsi. Sekarang yang menyenangkanon
adalah "this
" akan selalu menjadi target acara, dan bukan wadah yang dilampirkan.sumber
dengan
.on
metode yang dimungkinkan untuk dilakukan.live
,,.delegate
dan.bind
dengan fungsi yang sama tetapi dengan.live()
hanya.live()
dimungkinkan (mendelegasikan acara ke dokumen).jQuery("#example").bind( "click", fn )
=jQuery( "#example").on( "click", fn );
jQuery("#example").delegate( ".examples", "click", fn )
=jQuery( "#example" ).on( "click", ".examples", fn )
jQuery("#example").live( fn )
=jQuery( document ).on( "click", "#example", fn )
Saya dapat mengkonfirmasi ini langsung dari sumber jQuery:
jQuery (this.context)?
this.context
===document
dalam banyak kasussumber
(Kalimat pembuka saya lebih masuk akal sebelum Anda mengubah pertanyaan. Awalnya Anda akan mengatakan "Apa bedanya dengan
live
?")on
lebih sepertidelegate
daripada itulive
, pada dasarnya merupakan bentuk terpadubind
dandelegate
(pada kenyataannya, tim mengatakan tujuannya adalah "... untuk menyatukan semua cara melampirkan acara ke dokumen ..." ).live
pada dasarnyaon
(ataudelegate
) dilampirkan pada dokumen secara keseluruhan. Sudah usang pada v1.7 dalam mendukung menggunakanon
ataudelegate
. Ke depan, saya menduga kita akan melihat kodeon
hanya menggunakan , daripada menggunakanbind
ataudelegate
(ataulive
) ...Jadi dalam praktiknya, Anda dapat:
Gunakan
on
sepertibind
:Gunakan
on
likedelegate
(delegasi acara yang di-root pada elemen yang diberikan):Gunakan
on
likelive
(delegasi acara yang berakar pada dokumen):sumber
on
adalah kombinasi daribind
dandelegate
, dan seperti yang saya katakan, tidak terlalu sukalive
. Anda dapat menggunakanon
likebind
(melampirkan handler langsung ke suatu elemen), atau Anda dapat menggunakanon
likedelegate
(melampirkan handler ke suatu elemen, tetapi memecat event hanya jika elemen yang sebenarnya diklik cocok dengan pemilih, dan seolah-olah elemen itu adalah satu-satunya yang peristiwa terjadi pada - misalnya, delegasi acara), atau Anda dapat menggunakannya sepertilive
(delegate
menggunakan dokumen sebagai root). Delegasi acara yang membuatnya berguna jika Anda menambahkan elemen secara dinamis.$("#id", ".class").live(fn)
=$(".class").delegate("#id", fn );
Sebenarnya dalam sumber jQuery lama mereka menggunakan live sebagai case umum dan delegate sebagai case khusus, yang membuat ini semakin membingungkan ketika Anda memikirkannya.delegate
dengan cepat, tapi tetap saja. :-)live adalah jalan pintas untuk .on () sekarang
juga posting ini mungkin bermanfaat untuk Anda http://blog.jquery.com/2011/11/03/jquery-1-7-released/
sumber
Tidak ada satu untuk case use dasar. Kedua garis ini secara fungsional sama
.on () juga dapat melakukan delegasi acara, dan lebih disukai.
.bind () sebenarnya hanya alias untuk .on () sekarang. Berikut definisi fungsi bind di 1.7.1
Gagasan untuk menambahkan .on () adalah untuk membuat API acara terpadu, daripada memiliki beberapa fungsi untuk mengikat acara; .on () menggantikan .bind (), .live () dan .delegate ().
sumber
Sesuatu yang harus Anda waspadai jika Anda ingin mendapatkan event handler yang terkait dengan elemen - perhatikan elemen mana yang dilampirkan handler!
Misalnya, jika Anda menggunakan:
Anda akan mendapatkan penangan acara menggunakan:
Tetapi jika Anda menggunakan:
Anda akan mendapatkan penangan acara menggunakan:
(dalam kasus terakhir objek acara yang relevan akan memiliki pemilih = ". mySelector")
sumber
events
bagaimanapun tidak berdokumen dan saya pikir itu tidak lagi berfungsi di 1.9