Dibutuhkan terutama ketika saya perlu memuat beberapa file js di mana masing-masing berisi $ (dokumen) .ready (); function
Abdillah
@leora pertanyaan ini ditanyakan dalam sebuah wawancara: D Terima kasih
eirenaios
Jawaban:
288
Anda dapat memiliki lebih dari satu, tetapi tidak selalu merupakan hal yang paling rapi untuk dilakukan. Usahakan untuk tidak menggunakannya secara berlebihan, karena akan sangat memengaruhi keterbacaan. Selain itu, sangat legal. Lihat di bawah ini:
Perlu juga dicatat bahwa fungsi yang didefinisikan dalam satu $(document).readyblok tidak dapat dipanggil dari $(document).readyblok lain , saya hanya menjalankan tes ini:
Tidaklah bijaksana untuk bergantung pada urutan eksekusi ketika menggunakan beberapa pernyataan $ (dokumen) .ready (). Masing-masing perlu mengeksekusi secara independen dari yang lain yang telah dieksekusi atau tidak.
James
@ AoP - Saya tidak tahu berapa banyak akal yang masuk akal, jika mereka tidak dieksekusi secara berurutan, maka mereka sama sekali tidak berarti dalam konteks aplikasi, jadi menggunakan beberapa $ (dokumen). Sudah (blok akan rusak sama sekali.
karim79
7
@ karim79 tentu ini (pertanyaan OP) paling berlaku ketika menulis sedikit kode rumit dengan beberapa masalah startup - yaitu beberapa kode yang selalu dijalankan saat memuat selesai, dan beberapa yang hanya diperlukan pada beberapa node konten? Dalam situasi seperti itu, konteksnya harus di-silo, dan urutan pelaksanaannya harus tidak penting - bisa ditugaskan ke acara 'DOM ready' tanpa menimpa yang sebelumnya menjadi fitur yang berguna, terlepas dari perilaku pemesanan.
tehwalrus
1
Mengenai fungsi yang didefinisikan dalam satu blok siap tidak dapat dipanggil dari blok siap lainnya - ini benar cara Anda mendefinisikan fungsi, tetapi jika Anda mendefinisikannya sebagai saySomething = function () {} maka Anda dapat memanggilnya. Aneh, bukan? jsfiddle.net/f56qsogm mengujinya di sini.
fer
2
Saya pikir berperilaku seperti ini karena menambahkan fungsi ke objek jendela yang dapat diakses secara global. Kalau tidak, itu adalah fungsi deklaratif yang dicakup secara lokal ke fungsi siap itu.
fer
19
Anda bisa menggunakan banyak. Tetapi Anda juga dapat menggunakan banyak fungsi di dalam satu dokumen. Sudah juga:
Ini ok jika Anda memiliki kendali penuh atas kode yang dilampirkan pada halaman. Jika seseorang telah menulis ini di file lain yang dilampirkan ke halaman, maka Anda boleh menyatakannya seperti ini.
James Wiseman
Tidak yakin apa yang ingin Anda katakan. Tetapi jika Anda memasukkan ini ke dalam kepala Anda, dan menyertakan 15 JS eksternal lainnya, semua yang berisi satu (atau beberapa dokumen.beban) masih akan berfungsi seolah-olah hanya ada satu. Layak untuk disebutkan adalah bahwa sendok setiap fungsi / variabel berakhir dengan tanda kurung $ (dokumen). Sudah-fungsi.
Mickel
2
Hanya dengan mencoba mengatakan bahwa kadang-kadang, orang lain akan memiliki modul tertulis yang dilampirkan pada halaman yang memiliki fungsi siap dokumen sudah dinyatakan, sehingga Anda mungkin tidak memiliki kemewahan untuk memindahkan semua kode Anda ke satu fungsi (yang, diberikan, akan ideal ). Saya juga akan berhati-hati karena memiliki terlalu banyak barang di sini, karena kita akan mendapatkan On Ready Bloating, yang dapat membuat kode sama sulitnya untuk dipelihara.
James Wiseman
1
Ah, sekarang aku mengerti. Ya saya setuju itu. Baru saja menyatakan contoh untuk membuktikan bahwa itu mungkin;)
Mickel
15
Ya, Anda dapat dengan mudah memiliki beberapa blok. Berhati-hatilah dengan ketergantungan di antara mereka karena urutan evaluasi mungkin tidak seperti yang Anda harapkan.
Terima kasih, ada baiknya untuk memperjelas hal ini, karena - terlepas dari kebijaksanaan umum pada subjek - halaman jQuery ready () tidak benar-benar mengatakan apakah Anda bisa atau tidak (pada saat penulisan :)). Namun itu semacam menyiratkan tidak apa-apa, jika Anda membaca yang tersirat dari satu kalimat:Ready handlers bound this way are executed after any bound by the other three methods above.
Reg Edit
5
Ya itu mungkin tetapi Anda bisa lebih baik menggunakan div #mydiv dan menggunakan keduanya
Ya, itu baik-baik saja. Tapi hindari melakukannya tanpa alasan. Sebagai contoh saya menggunakannya untuk mendeklarasikan aturan situs global secara terpisah dari halaman individual ketika file javascript saya dihasilkan secara dinamis tetapi jika Anda terus melakukannya berulang-ulang akan membuatnya sulit untuk dibaca.
Anda juga tidak dapat mengakses beberapa metode dari jQuery(function(){});panggilan lain
sehingga itu alasan lain Anda tidak ingin melakukan itu.
Dengan yang lama window.onloadmeskipun Anda akan mengganti yang lama setiap kali Anda menentukan fungsi.
Beberapa bagian siap dokumen sangat berguna jika Anda memiliki modul lain yang keluar dari halaman yang sama yang menggunakannya. Dengan window.onload=funcdeklarasi lama , setiap kali Anda menentukan fungsi yang akan dipanggil, itu menggantikan yang lama.
Sekarang semua fungsi yang ditentukan dalam antrian / ditumpuk (dapatkah seseorang mengonfirmasi?) Terlepas dari bagian siap dokumen mana mereka ditentukan.
Itu legal, tetapi kadang-kadang menyebabkan perilaku yang tidak diinginkan. Sebagai contoh, saya menggunakan pustaka MagicSuggest dan menambahkan dua input MagicSuggest di halaman proyek saya dan menggunakan fungsi siap dokumen terpisah untuk setiap inisialisasi input. Inisialisasi Input pertama berfungsi, tetapi tidak yang kedua dan juga tidak memberikan kesalahan, Input Kedua tidak muncul. Jadi, saya selalu menyarankan untuk menggunakan satu Fungsi Siap Dokumen.
<html><head><scriptsrc="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script><script>
$(document).ready(function(){
$("#hide").click(function(){
$("#test").hide();});
$("#show").click(function(){
$("#test").show();});});</script></head><body><h2>This is a test of jQuery!</h2><pid="test">This is a hidden paragraph.</p><buttonid="hide">Click me to hide</button><buttonid="show">Click me to show</button></body>
jawaban sebelumnya menunjukkan menggunakan beberapa fungsi bernama di dalam blok .ready tunggal, atau fungsi tunggal yang tidak disebutkan namanya di blok .ready, dengan fungsi bernama lain di luar blok .ready. Saya menemukan pertanyaan ini ketika meneliti apakah ada cara untuk memiliki beberapa fungsi yang tidak disebutkan namanya di dalam blok .ready - Saya tidak bisa mendapatkan sintaks yang benar. Saya akhirnya menemukan jawabannya, dan berharap bahwa dengan memposting kode pengujian saya, saya akan membantu orang lain mencari jawaban atas pertanyaan yang sama dengan yang saya miliki.
Dapatkah Anda menggambarkan bagaimana ini berbeda dari jawaban yang lain?
Stephen Rauch
yakin: jawaban sebelumnya menunjukkan menggunakan beberapa fungsi bernama di dalam blok .ready tunggal, atau fungsi tunggal yang tidak disebutkan namanya di blok .ready, dengan fungsi bernama lainnya di luar blok .ready. Saya menemukan pertanyaan ini ketika meneliti apakah ada cara untuk memiliki beberapa fungsi yang tidak disebutkan namanya di dalam blok .ready - Saya tidak bisa mendapatkan sintaks yang benar. Saya akhirnya menemukan jawabannya, dan berharap bahwa dengan memposting kode pengujian saya, saya akan membantu orang lain mencari jawaban untuk pertanyaan yang sama dengan yang saya miliki.
JEPrice
Maaf, maksud saya dalam pertanyaan. Ada tombol edit di kiri bawah kotak teks. Menjelaskan mengapa solusi Anda berbeda / lebih baik menjadikannya jawaban yang jauh lebih baik karena pembaca masa depan dapat lebih cepat memahami "Mengapa". Terima kasih.
Jawaban:
Anda dapat memiliki lebih dari satu, tetapi tidak selalu merupakan hal yang paling rapi untuk dilakukan. Usahakan untuk tidak menggunakannya secara berlebihan, karena akan sangat memengaruhi keterbacaan. Selain itu, sangat legal. Lihat di bawah ini:
http://www.learningjquery.com/2006/09/multiple-document-ready
Coba ini:
Anda akan menemukan bahwa ini setara dengan ini, perhatikan urutan eksekusi:
Perlu juga dicatat bahwa fungsi yang didefinisikan dalam satu
$(document).ready
blok tidak dapat dipanggil dari$(document).ready
blok lain , saya hanya menjalankan tes ini:output adalah:
sumber
Anda bisa menggunakan banyak. Tetapi Anda juga dapat menggunakan banyak fungsi di dalam satu dokumen. Sudah juga:
sumber
Ya, Anda dapat dengan mudah memiliki beberapa blok. Berhati-hatilah dengan ketergantungan di antara mereka karena urutan evaluasi mungkin tidak seperti yang Anda harapkan.
sumber
Ya , mungkin memiliki beberapa panggilan $ (dokumen) .ready (). Namun, saya tidak berpikir Anda bisa tahu bagaimana mereka akan dieksekusi. (sumber)
sumber
Ready handlers bound this way are executed after any bound by the other three methods above.
Ya itu mungkin tetapi Anda bisa lebih baik menggunakan div #mydiv dan menggunakan keduanya
sumber
Ya, itu baik-baik saja. Tapi hindari melakukannya tanpa alasan. Sebagai contoh saya menggunakannya untuk mendeklarasikan aturan situs global secara terpisah dari halaman individual ketika file javascript saya dihasilkan secara dinamis tetapi jika Anda terus melakukannya berulang-ulang akan membuatnya sulit untuk dibaca.
Anda juga tidak dapat mengakses beberapa metode dari
jQuery(function(){});
panggilan lain sehingga itu alasan lain Anda tidak ingin melakukan itu.Dengan yang lama
window.onload
meskipun Anda akan mengganti yang lama setiap kali Anda menentukan fungsi.sumber
Ya kamu bisa.
Beberapa bagian siap dokumen sangat berguna jika Anda memiliki modul lain yang keluar dari halaman yang sama yang menggunakannya. Dengan
window.onload=func
deklarasi lama , setiap kali Anda menentukan fungsi yang akan dipanggil, itu menggantikan yang lama.Sekarang semua fungsi yang ditentukan dalam antrian / ditumpuk (dapatkah seseorang mengonfirmasi?) Terlepas dari bagian siap dokumen mana mereka ditentukan.
sumber
Saya pikir cara yang lebih baik untuk pergi adalah untuk menempatkan beralih ke fungsi bernama (Periksa melimpah ini untuk lebih lanjut tentang subjek itu) . Dengan begitu Anda dapat memanggil mereka dari satu peristiwa.
Seperti itu:
Dengan begitu Anda dapat memuatnya dalam satu fungsi siap pakai.
});
Ini akan menampilkan yang berikut ke console.log Anda:
Dengan cara ini Anda dapat menggunakan kembali fungsi untuk acara lain.
sumber
Itu legal, tetapi kadang-kadang menyebabkan perilaku yang tidak diinginkan. Sebagai contoh, saya menggunakan pustaka MagicSuggest dan menambahkan dua input MagicSuggest di halaman proyek saya dan menggunakan fungsi siap dokumen terpisah untuk setiap inisialisasi input. Inisialisasi Input pertama berfungsi, tetapi tidak yang kedua dan juga tidak memberikan kesalahan, Input Kedua tidak muncul. Jadi, saya selalu menyarankan untuk menggunakan satu Fungsi Siap Dokumen.
sumber
Anda bahkan dapat membuat dokumen fungsi siap di dalam file html yang disertakan. Berikut ini contoh menggunakan jquery:
File: test_main.html
File: test_embed.html
Output konsol:
Browser menunjukkan:
test_embed.html
sumber
Anda juga dapat melakukannya dengan cara berikut:
jawaban sebelumnya menunjukkan menggunakan beberapa fungsi bernama di dalam blok .ready tunggal, atau fungsi tunggal yang tidak disebutkan namanya di blok .ready, dengan fungsi bernama lain di luar blok .ready. Saya menemukan pertanyaan ini ketika meneliti apakah ada cara untuk memiliki beberapa fungsi yang tidak disebutkan namanya di dalam blok .ready - Saya tidak bisa mendapatkan sintaks yang benar. Saya akhirnya menemukan jawabannya, dan berharap bahwa dengan memposting kode pengujian saya, saya akan membantu orang lain mencari jawaban atas pertanyaan yang sama dengan yang saya miliki.
sumber