Saya memiliki skrip yang menggunakan $(document).ready
, tetapi tidak menggunakan apa pun dari jQuery. Saya ingin meringankannya dengan menghapus ketergantungan jQuery.
Bagaimana saya bisa mengimplementasikan $(document).ready
fungsionalitas saya sendiri tanpa menggunakan jQuery? Saya tahu bahwa menggunakan window.onload
tidak akan sama, seperti window.onload
kebakaran setelah semua gambar, bingkai, dll. Dimuat.
javascript
jquery
FlySwat
sumber
sumber
$(document).ready
, Anda dapat menyelesaikan masalah itu dengan mudah dengan menjalankan kode Anda di bagian paling bawah halaman alih-alih di bagian atas. HTML5Boilerplate menggunakan pendekatan yang tepat ini.Jawaban:
Ada pengganti berbasis standar,
DOMContentLoaded
yang didukung oleh lebih dari 98% browser , meskipun tidak IE8:Fungsi asli jQuery jauh lebih rumit dari sekedar window.onload, seperti yang digambarkan di bawah ini.
sumber
Edit:
Berikut ini adalah pengganti jQuery yang layak
Diambil dari https://plainjs.com/javascript/events/running-code-when-the-document-is-ready-15/
Fungsi domReady lain yang baik di sini diambil dari https://stackoverflow.com/a/9899701/175071
Karena jawaban yang diterima sangat jauh dari lengkap, saya menjahit fungsi "siap" seperti
jQuery.ready()
berdasarkan sumber jQuery 1.6.2:Cara Penggunaan:
Saya tidak yakin seberapa fungsional kode ini, tetapi berfungsi baik dengan tes yang dangkal saya. Ini memakan waktu cukup lama, jadi saya harap Anda dan orang lain dapat memperoleh manfaat darinya.
PS: Saya sarankan kompilasi itu.
Atau Anda dapat menggunakan http://dustindiaz.com/smallest-domready-ever :
atau fungsi asli jika Anda hanya perlu mendukung browser baru (Tidak seperti jQuery ready, ini tidak akan berjalan jika Anda menambahkan ini setelah halaman dimuat)
sumber
Tiga opsi:
script
tag terakhir dari badan, DOM akan siap sebelum tag skrip dieksekusionreadystatechange
Sumber: MDN
DOMContentLoaded
Khawatir tentang browser zaman batu: Buka kode sumber jQuery dan gunakan
ready
fungsinya. Dalam hal ini Anda tidak memparsing + mengeksekusi seluruh perpustakaan yang Anda lakukan hanya sebagian kecil saja.sumber
Tempatkan
<script>/*JavaScript code*/</script>
tepat sebelum</body>
tag penutup .Memang, ini mungkin tidak sesuai dengan tujuan semua orang karena itu membutuhkan mengubah file HTML daripada hanya melakukan sesuatu dalam file JavaScript a la
document.ready
, tapi masih ...sumber
</html>
tag penutup ?html
tag hanya boleh berisihead
danbody
.Solusi orang miskin:
Lihat Fiddle
Ditambahkan yang satu ini, sedikit lebih baik kurasa, memiliki cakupan sendiri, dan tidak rekursif
Lihat Fiddle
sumber
setInterval
dan hapus rekursi sepenuhnya.Saya menggunakan ini:
Catatan: Ini mungkin hanya berfungsi dengan browser yang lebih baru, terutama ini: http://caniuse.com/#feat=domcontentloaded
sumber
Sungguh, jika Anda hanya peduli dengan Internet Explorer 9+ , kode ini akan cukup untuk menggantikan
jQuery.ready
:Jika Anda khawatir tentang Internet Explorer 6 dan beberapa browser yang sangat aneh dan langka, ini akan berfungsi:
sumber
Pertanyaan ini sudah lama ditanyakan. Bagi siapa pun yang hanya melihat pertanyaan ini, sekarang ada situs yang disebut "Anda mungkin tidak perlu jquery" yang rusak - sesuai tingkat dukungan IE yang diperlukan - semua fungsi jquery dan menyediakan beberapa perpustakaan alternatif yang lebih kecil.
Skrip siap dokumen IE8 menurut Anda mungkin tidak perlu jquery
sumber
'onreadystatechange'
ini perlu daripadadocument.attachEvent('onload', fn);
Baru-baru ini saya menggunakan ini untuk situs seluler. Ini adalah versi sederhana John Resig dari "Teknik JavaScript Pro". Itu tergantung pada addEvent.
sumber
Peramban silang (peramban lama juga) dan solusi sederhana:
Menampilkan lansiran di jsfiddle
sumber
Jawaban jQuery cukup berguna bagi saya. Dengan sedikit pengilangan itu sesuai dengan kebutuhan saya. Saya harap ini membantu orang lain.
sumber
removeListener
perlu dipanggil dengan dokumen sebagai konteksnya, yaitu.removeListener.call(document, ...
Berikut ini cuplikan kode terkecil untuk menguji DOM ready yang berfungsi di semua browser (bahkan IE 8):
Lihat ini jawaban .
sumber
Cukup tambahkan ini ke bagian bawah halaman HTML Anda ...
Karena, dokumen HTML diuraikan oleh atas-bawah.
sumber
Layak dicari di Rock Solid addEvent () dan http://www.braksator.com/how-to-make-your-own-jquery .
Berikut adalah kode jika situs turun
sumber
Kode lintas-peramban ini akan memanggil fungsi setelah DOM siap:
Begini cara kerjanya:
domReady
memanggiltoString
metode fungsi untuk mendapatkan representasi string dari fungsi yang Anda berikan dan membungkusnya dalam ekspresi yang segera memanggil fungsi.domReady
membuat elemen skrip dengan ekspresi dan menambahkannya kebody
dokumen.body
setelah DOM siap.Misalnya, jika Anda melakukan ini
domReady(function(){alert();});
:, berikut ini akan ditambahkan kebody
elemen:Perhatikan bahwa ini hanya berfungsi untuk fungsi yang ditentukan pengguna. Berikut ini tidak akan berfungsi:
domReady(alert);
sumber
Ini tahun 2020 dan
<script>
tag memilikidefer
atribut.sebagai contoh:
itu menentukan bahwa skrip dieksekusi ketika halaman telah selesai parsing.
https://www.w3schools.com/tags/att_script_defer.asp
sumber
Bagaimana dengan solusi ini?
sumber
Itu selalu baik untuk menggunakan setara JavaScript dibandingkan dengan jQuery. Salah satu alasannya adalah satu perpustakaan lebih sedikit untuk bergantung dan mereka jauh lebih cepat daripada setara jQuery.
Salah satu referensi fantastis untuk setara jQuery adalah http://youmightnotneedjquery.com/ .
Sejauh pertanyaan Anda prihatin, saya mengambil kode di bawah ini dari tautan di atas :) Hanya peringatan apakah itu hanya bekerja dengan Internet Explorer 9 dan yang lebih baru.
sumber
Paling minimal dan 100% berfungsi
Saya telah mengambil jawaban dari PlainJS dan itu berfungsi dengan baik untuk saya. Itu meluas
DOMContentLoaded
sehingga dapat diterima di semua browser.Fungsi ini setara dengan
$(document).ready()
metode jQuery :Namun, berbeda dengan jQuery, kode ini hanya akan berjalan dengan baik di browser modern (IE> 8) dan itu tidak akan terjadi jika dokumen sudah dirender pada saat skrip ini disisipkan (misalnya melalui Ajax). Karena itu, kita perlu sedikit memperluas ini:
Ini pada dasarnya mencakup semua kemungkinan dan merupakan pengganti yang layak untuk pembantu jQuery.
sumber
Kami menemukan penerapan lintas peramban kami yang cepat dan kotor yang dapat melakukan trik untuk kebanyakan kasus sederhana dengan penerapan minimal:
sumber
doc.body
!Solusi setTimeout / setInterval yang disajikan di sini hanya akan berfungsi dalam keadaan tertentu.
Masalahnya muncul terutama di versi Internet Explorer yang lebih lama hingga 8.
Variabel yang mempengaruhi keberhasilan solusi setTimeout / setInterval ini adalah:
kode asli (Javascript asli) yang menyelesaikan masalah khusus ini ada di sini:
ini adalah kode dari mana tim jQuery membangun implementasi mereka.
sumber
Inilah yang saya gunakan, cepat dan mencakup semua basis yang saya pikir; bekerja untuk semuanya kecuali IE <9.
Ini sepertinya menangkap semua kasus:
Acara DOMContentLoaded tersedia di IE9 dan yang lainnya, jadi saya pribadi berpikir tidak masalah untuk menggunakan ini. Tulis ulang deklarasi fungsi panah ke fungsi anonim biasa jika Anda tidak mengubah kode dari ES2015 ke ES5.
Jika Anda ingin menunggu sampai semua aset dimuat, semua gambar ditampilkan dll, kemudian gunakan window.onload.
sumber
Jika Anda tidak harus mendukung browser yang sangat lama, berikut adalah cara untuk melakukannya bahkan ketika skrip eksternal Anda dimuat dengan atribut async :
sumber
Untuk IE9 +:
sumber
Jika Anda memuat jQuery di dekat bagian bawah BODY, tetapi mengalami masalah dengan kode yang menuliskan jQuery (<func>) atau jQuery (dokumen) .ready (<func>), periksa jqShim di Github.
Alih-alih membuat ulang fungsi siap dokumennya sendiri, ia hanya memegang fungsi-fungsi tersebut sampai jQuery tersedia kemudian dilanjutkan dengan jQuery seperti yang diharapkan. Inti memindahkan jQuery ke bagian bawah tubuh adalah untuk mempercepat pemuatan halaman, dan Anda masih bisa mencapainya dengan menambahkan jqShim.min.js di kepala template Anda.
Saya akhirnya menulis kode ini untuk memindahkan semua skrip di WordPress ke footer, dan kode shim ini sekarang berada langsung di header.
sumber
Coba ini:
sumber
onDocReady memberikan panggilan balik ketika dom HTML siap untuk sepenuhnya mengakses / mengurai / memanipulasi.
onWinLoad memberikan panggilan balik ketika semuanya telah dimuat (gambar dll)
sumber
sumber
Sebagian besar fungsi JS Ready vanilla TIDAK mempertimbangkan skenario di mana
DOMContentLoaded
handler diatur setelah dokumen sudah dimuat - Yang berarti fungsi tidak akan pernah berjalan . Ini dapat terjadi jika Anda mencari diDOMContentLoaded
dalamasync
skrip eksternal (<script async src="file.js"></script>
).Kode di bawah ini memeriksa
DOMContentLoaded
hanya jika dokumenreadyState
beluminteractive
ataucomplete
.Jika Anda ingin mendukung IE juga:
sumber
Saya hanya menggunakan:
Dan tidak
document.addEventListener("DOMContentLoaded" //etc
seperti pada jawaban paling atas, ia bekerja sejauh IE9 - http://caniuse.com/#search=DOMContentLoaded hanya menunjukkan baru-baru ini sebagai IE11.Menariknya saya menemukan
setTimeout
solusi ini pada tahun 2009: Apakah memeriksa kesiapan DOM berlebihan?, yang mungkin bisa dikatakan sedikit lebih baik, seperti yang saya maksudkan "apakah itu berlebihan untuk menggunakan berbagai pendekatan kerangka kerja yang lebih rumit untuk memeriksa kesiapan DOM".Penjelasan terbaik saya untuk mengapa teknik ini bekerja adalah bahwa, ketika skrip dengan setTimeout telah tercapai, DOM sedang diurai, jadi eksekusi kode dalam setTimeout ditunda sampai operasi selesai.
sumber