Saya ingin menjalankan sedikit javascript sebelum seluruh halaman dimuat. Apakah ini mungkin? Atau apakah kode mulai dijalankan </html>
?
javascript
html
picknick
sumber
sumber
Jawaban:
Anda tidak hanya dapat melakukannya , tetapi Anda harus melakukan upaya khusus untuk tidak melakukannya jika Anda tidak menginginkannya. :-)
Saat browser menemukan
script
tag klasik saat mengurai HTML, browser akan berhenti mengurai dan menyerahkan penerjemah JavaScript, yang menjalankan skrip tersebut. Parser tidak melanjutkan hingga eksekusi skrip selesai (karena skrip mungkin melakukandocument.write
panggilan ke markup keluaran yang harus ditangani oleh parser).Itu adalah perilaku default, tetapi Anda memiliki beberapa opsi untuk menunda eksekusi skrip:
Gunakan modul JavaScript. Sebuah
type="module"
skrip ditangguhkan hingga HTML telah diurai sepenuhnya dan DOM awal dibuat. Ini bukan alasan utama untuk menggunakan modul, tetapi itu salah satu alasannya:Kode akan diambil (jika terpisah) dan diurai secara paralel dengan penguraian HTML, tetapi tidak akan dijalankan hingga penguraian HTML selesai. (Jika kode modul Anda sebaris dan bukan dalam filenya sendiri, itu juga ditangguhkan hingga penguraian HTML selesai.)
Ini tidak tersedia ketika saya pertama kali menulis jawaban ini pada tahun 2010, tetapi di sini pada tahun 2020, semua modul dukungan browser modern utama secara native, dan jika Anda perlu mendukung browser lama, Anda dapat menggunakan bundler seperti Webpack dan Rollup.js.
Gunakan
defer
atribut pada tag skrip klasik:Seperti halnya modul, kode dalam
my-code.js
akan diambil dan diurai secara paralel dengan penguraian HTML, tetapi tidak akan dijalankan hingga penguraian HTML selesai. Namun ,defer
tidak berfungsi dengan konten skrip sebaris, hanya dengan file eksternal yang dirujuk melaluisrc
.Menurut saya bukan itu yang Anda inginkan, tetapi Anda dapat menggunakan
async
atribut untuk memberi tahu browser agar mengambil kode JavaScript secara paralel dengan penguraian HTML, tetapi kemudian menjalankannya sesegera mungkin, bahkan jika penguraian HTML belum selesai . Anda dapat meletakkannya ditype="module"
tag, atau menggunakannya sebagai penggantidefer
discript
tag klasik .Letakkan
script
tag di akhir dokumen, tepat sebelum</body>
tag penutup :Dengan begitu, meskipun kode dijalankan segera setelah ditemukan, semua elemen yang ditentukan oleh HTML di atasnya ada dan siap digunakan.
Biasanya hal ini menyebabkan penundaan tambahan pada beberapa browser karena browser tidak akan mulai mengambil kode hingga
script
tag ditemukan, tetapi browser modern memindai dan mulai mengambil terlebih dahulu. Namun, ini adalah pilihan ketiga pada saat ini, baik modul dandefer
pilihan yang lebih baik.Spec memiliki diagram yang berguna menunjukkan baku
script
tag,defer
,async
,type="module"
, dantype="module" async
dan waktu ketika kode JavaScript diambil dan dijalankan:Berikut adalah contoh perilaku default,
script
tag mentah :(Lihat jawaban saya di sini untuk detail seputar
NodeList
kode itu.)Ketika Anda menjalankannya, Anda melihat "Paragraf 1" berwarna hijau tetapi "Paragraf 2" berwarna hitam, karena skrip berjalan serentak dengan penguraian HTML, sehingga hanya menemukan paragraf pertama, bukan yang kedua.
Sebaliknya, inilah
type="module"
skripnya:Perhatikan bagaimana keduanya sekarang hijau; kode tidak berjalan sampai penguraian HTML selesai. Itu juga berlaku dengan
defer
script
konten eksternal (tetapi tidak dengan konten inline).(Tidak perlu melakukan
NodeList
pemeriksaan di sana karena modul pendukung browser modern sudahforEach
aktifNodeList
.)Di dunia modern ini, tidak ada nilai nyata untuk
DOMContentLoaded
acara fitur "siap" yang PrototypeJS, jQuery, ExtJS, Dojo, dan sebagian besar lainnya disediakan kembali pada hari itu (dan masih disediakan); cukup gunakan modul ataudefer
. Bahkan di masa lalu, tidak banyak alasan untuk menggunakannya (dan mereka sering digunakan secara tidak benar, menahan presentasi halaman sementara seluruh pustaka jQuery dimuat karenascript
ada di dalamhead
alih - alih setelah dokumen), sesuatu beberapa pengembang di Google menandai sejak awal. Ini juga bagian dari alasan rekomendasi YUI untuk meletakkan skrip di akhirbody
, kembali pada hari itu.sumber
<body onload="doIt()>"
.load
Acara terjadi sangat terlambat dalam siklus pemuatan halaman, hampir tidak pernah praktik terbaik untuk menunggu untuk menjalankan JavaScript Anda sampai saat itu. Tapi ya, itu adalah pilihan. Saya sudah merombak jawabannya untuk tahun 2020, btw.document.addEventListener('DOMContentLoaded', function(){ //doyour stuff })
Anda dapat menjalankan kode javascript kapan saja. AFAIK itu dijalankan pada saat browser mencapai tag <script> tempatnya berada. Tetapi Anda tidak dapat mengakses elemen yang belum dimuat.
Jadi jika Anda membutuhkan akses ke elemen, Anda harus menunggu sampai DOM dimuat (ini tidak berarti seluruh halaman dimuat, termasuk gambar dan lainnya. Ini hanya struktur dokumen, yang dimuat lebih awal, jadi Anda biasanya menang tidak melihat penundaan), menggunakan
DOMContentLoaded
acara atau fungsi seperti$.ready
di jQuery.sumber