Dari situs dokumen jQuery API untukready
Ketiga sintaks berikut ini setara:
- $ (document) .ready (handler)
- $ (). ready (handler) (ini tidak disarankan)
- $ (penangan)
Setelah mengerjakan pekerjaan rumah - membaca dan bermain-main dengan kode sumber , saya tidak tahu mengapa
$().ready(handler)
tidak disarankan. Cara pertama dan ketiga, persis sama, opsi ketiga memanggil fungsi siap pada objek jQuery yang di-cache dengan document
:
rootjQuery = jQuery(document);
...
...
// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
return rootjQuery.ready( selector );
}
Tetapi fungsi siap tidak memiliki interaksi dengan pemilih elemen node yang dipilih, ready
Kode sumber:
ready: function( fn ) {
// Attach the listeners
jQuery.bindReady();
// Add the callback
readyList.add( fn );
return this;
},
Seperti yang Anda lihat, itu hanya menambahkan callback ke antrian internal ( readyList
) dan tidak mengubah atau menggunakan elemen dalam set. Ini memungkinkan Anda memanggil ready
fungsi pada setiap objek jQuery.
Suka:
- pemilih reguler :
$('a').ready(handler)
DEMO - Pemilih yang tidak masuk akal :
$('fdhjhjkdafdsjkjriohfjdnfj').ready(handler)
DEMO - Pemilih tidak ditentukan :
$().ready(handler)
DEMO
Akhirnya ... untuk pertanyaan saya: Mengapa $().ready(handler)
tidak direkomendasikan?
javascript
jquery
callback
document-ready
gdoron mendukung Monica
sumber
sumber
$.ready
misalnya) dan tidak perlu membangun objek jQuery di tempat pertama..ready()
kemampuan untuk elemen individual, seharusnya tidak ada alasan untuk membuat objek jQuery.$.ready
sudah diambil oleh fungsi jQuery internal, cari kode sumbernyaready:
.Jawaban:
Saya mendapat jawaban resmi dari salah satu pengembang jQuery:
$().ready(fn)
hanya berfungsi karena$()
dulunya adalah pintasan ke$(document)
(jQuery <1.4)Jadi
$().ready(fn)
kode yang dapat dibaca.Tapi orang biasa melakukan hal-hal seperti
$().mouseover()
dan segala macam kegilaan lainnya.dan yang harus dilakukan orang
$([])
untuk mendapatkan objek jQuery kosongJadi di 1.4 kami mengubahnya jadi
$()
memberikan jQuery kosong dan kami baru saja membuat$().ready(fn)
pekerjaan agar tidak merusak banyak kode$().ready(fn)
secara harfiah sekarang hanya ditambal di inti agar berfungsi dengan baik untuk kasus lama.Tempat terbaik untuk
ready
fungsinya adalah$.ready(fn)
, tetapi ini adalah keputusan desain yang sangat lama dan itulah yang kita miliki sekarang.Saya bertanya kepadanya:
Jawabannya adalah:
sumber
$()
sejak awal (sama konyolnya dengan perilaku itu) . Di sisi lain, Anda benar. Mereka tidak selalu cenderung membuat perubahan yang melanggar, seperti yang ditunjukkan saat mereka mencoba mengubah.attr()
, lalu melakukan perubahan cepat beberapa hari kemudian. Ini telah mengikat mereka pada beberapa keputusan desain awal (dan paruh baya) yang tidak menguntungkan.$(selector[, context])
dan$(html[, ownerDocument])
. Faktanya, Anda mungkin juga hanya menggunakanjQuery()
daripada$()
jika harus tahu-itu-masalahnya adalah masalahnya. Atau mengapa bahkan menggunakan jQuery sama sekali?Karena opsi yang berbeda melakukan hal yang hampir sama seperti yang Anda tunjukkan, inilah saatnya untuk mengenakan topi penulis perpustakaan dan membuat beberapa tebakan.
Mungkin orang-orang jQuery ingin
$()
tersedia untuk digunakan di masa mendatang (diragukan karena$().ready
didokumentasikan untuk bekerja, bahkan jika tidak direkomendasikan; itu juga akan mencemari semantik$
jika kasus khusus).Alasan yang jauh lebih praktis: versi kedua adalah satu-satunya yang tidak berakhir dengan penggabungan
document
, jadi lebih mudah untuk dipecahkan saat mempertahankan kode. Contoh:// BEFORE $(document).ready(foo); // AFTER: works $(document).ready(foo).on("click", "a", function() {});
Bandingkan ini dengan
// BEFORE $().ready(foo); // AFTER: breaks $().ready(foo).on("click", "a", function() {});
Terkait dengan hal di atas:
ready
adalah freak dalam arti bahwa itu (satu-satunya?) Metode yang akan bekerja sama tidak peduli apa yang dibungkus objek jQuery (bahkan jika itu tidak membungkus apa pun seperti yang terjadi di sini). Ini adalah perbedaan utama dari semantik metode jQuery lainnya, jadi secara khusus mengandalkan ini tidak disarankan.Pembaruan: Seperti yang ditunjukkan oleh komentar Esailija, dari perspektif teknik
ready
harus benar-benar menjadi metode statis karena cara kerjanya seperti ini.Pembaruan # 2: Menggali sumbernya, tampaknya di beberapa titik di cabang 1.4
$()
diubah agar sesuai$([])
, sementara di 1.3 berperilaku seperti itu$(document)
. Perubahan ini akan memperkuat justifikasi di atas.sumber
$(document).ready( function(){ //your code here } );
selector = selector || document
menjadiif(!selector) return this
.Saya akan mengatakan itu hanya fakta yang
$()
mengembalikan objek kosong sedangkan$(document)
tidak begitu Anda menerapkanready()
ke hal-hal yang berbeda; itu masih berfungsi, tetapi saya akan mengatakan itu tidak intuitif.$(document).ready(function(){}).prop("title") // the title $().ready(function(){}).prop("title") //null - no backing document
sumber
$()
.ready
karena itu adalah ungkapan yang mapan untuk tidak melakukannya. Tentu ada kemungkinan teoritis seseorang melakukan ini tetapi saya belum pernah melihat kode melakukan itu (yang bukan argumen yang bagus tetapi Anda tahu: D).Kemungkinan besar ini hanya bug dokumentasi dan harus diperbaiki, satu-satunya downside untuk menggunakan
$().ready(handler)
adalah keterbacaannya. Tentu, membantah itu$(handler)
sama tidak terbacanya. Saya setuju, itulah mengapa saya tidak menggunakannya .Anda juga dapat berargumen bahwa satu metode lebih cepat dari yang lain. Namun, seberapa sering Anda memanggil metode ini cukup sering berturut-turut pada satu halaman untuk melihat perbedaannya?
Pada akhirnya itu tergantung pada preferensi pribadi. Tidak ada kerugian untuk menggunakan
$().ready(handler)
selain argumen keterbacaan. Saya pikir dokumentasinya salah memimpin dalam kasus ini.sumber
Hanya untuk memperjelas bahwa ada beberapa ketidakkonsistenan dalam ketiganya, ditambah saya menambahkan formulir keempat yang sering digunakan:
(function($) {}(jQuery));
Dengan markup ini:
<div >one</div> <div>two</div> <div id='t'/>
dan kode ini:
var howmanyEmpty = $().ready().find('*').length; var howmanyHandler = $(function() {}).find('*').length; var howmanyDoc = $(document).ready().find('*').length; var howmanyPassed = (function($) { return $('*').length; }(jQuery)); var howmanyYuck = (function($) {}(jQuery)); var howmanyYuckType = (typeof howmanyYuck); $(document).ready(function() { $('#t').text(howmanyEmpty + ":" + howmanyHandler + ":" + howmanyDoc + ":" + howmanyPassed + ":" + howmanyYuckType); });
Hasil div yang ditampilkan dari pernyataan terakhir adalah: 0: 9: 9: 9: tidak terdefinisi
JADI, hanya versi Handler dan Doc yang konsisten dengan konvensi jQuery untuk mengembalikan sesuatu yang berguna karena mereka mendapatkan pemilih dokumen dan dengan formulir Lulus Anda harus mengembalikan sesuatu (saya tidak akan melakukan ini, saya pikir, tetapi taruh di dalamnya saja untuk menunjukkan "di dalam" itu memiliki sesuatu).
Berikut adalah versi biola ini untuk yang penasaran: http://jsfiddle.net/az85G/
sumber
null
sehingga.find('*').length
kembali 0 . Apakah Anda menemukan sesuatu yang buruk dengan perilaku (jelas) ini?if(!selector) return this
jika Anda memberikan sesuatu yang lain, adaregex
dan hal-hal lain terjadi ... Terima kasih atas kata-kata yang baik ... Saya rasa saya mungkin akan meminta tim jQuery untuk jawab ini (sih, ini bukan perpustakaanku:-)
).jQuery(document).ready(function(){});
formulir dalam basis kode kami saat ini karena ada tingkat keahlian jQuery yang berbeda dan "paling jelas" bagi orang baru bahwa itu IS fungsi penanganan acara untuk jQuery.Saya pikir ini benar-benar lebih untuk keterbacaan daripada apa pun.
Yang ini tidak terlalu ekspresif
sebagai
$(document).ready(handler)
Mungkin mereka mencoba mempromosikan beberapa bentuk jQuery idiomatik.
sumber
$(document).ready(handler)
lebih mudah dibaca daripada$(handler)
yang direkomendasikan IS ...