Apa perbedaan antara metode JavaScript window.onload
dan jQuery $(document).ready()
?
$().ready()
membuatnya menyala setelah window.onload
beberapa waktu.
Apa perbedaan antara metode JavaScript window.onload
dan jQuery $(document).ready()
?
$().ready()
membuatnya menyala setelah window.onload
beberapa waktu.
Jawaban:
The ready
peristiwa terjadi setelah dokumen HTML telah dimuat, sedangkan onload
peristiwa terjadi kemudian, ketika semua konten (misalnya gambar) juga telah dimuat.
The onload
event adalah peristiwa standar dalam DOM, sedangkan ready
acara khusus untuk jQuery. Tujuan ready
acara adalah bahwa itu harus terjadi sedini mungkin setelah dokumen dimuat, sehingga kode yang menambahkan fungsionalitas ke elemen-elemen di halaman tidak harus menunggu semua konten dimuat.
ready
event ini khusus untuk jQuery. Itu menggunakan DOMContentLoaded
acara jika tersedia di browser, jika tidak meniru itu. Tidak ada padanan yang pasti dalam DOM karena DOMContentLoaded
acara tersebut tidak didukung di semua browser.
onload
. onload
adalah nama properti objek yang menyimpan fungsi yang akan dipanggil ketika load
acara dipicu.
window.onload
adalah acara JavaScript bawaan, tetapi karena implementasinya memiliki kebiasaan yang tidak kentara di seluruh peramban (Firefox, Internet Explorer 6, Internet Explorer 8, dan Opera ), jQuery menyediakan document.ready
, yang mengabstraksikan mereka yang pergi, dan langsung menyala begitu DOM laman siap (tidak menunggu gambar, dll.)
$(document).ready
(perhatikan bahwa ini bukan document.ready
, yang tidak ditentukan) adalah fungsi jQuery, membungkus dan memberikan konsistensi pada peristiwa berikut:
document.ondomcontentready
/ document.ondomcontentloaded
- peristiwa agak baru yang muncul ketika DOM dokumen dimuat (yang mungkin beberapa waktu sebelum gambar, dll. dimuat); lagi, sedikit berbeda di Internet Explorer dan di seluruh duniawindow.onload
(yang diterapkan bahkan di browser lama), yang menyala ketika seluruh halaman dimuat (gambar, gaya, dll.)load
acara window
diimplementasikan cukup konsisten di seluruh browser. Masalah yang coba diselesaikan oleh jQuery dan perpustakaan lain adalah yang Anda sebutkan, yaitu bahwa load
acara tersebut tidak diaktifkan hingga semua sumber daya dependen seperti gambar dan stylesheet dimuat, yang bisa lama setelah DOM dimuat sepenuhnya, diberikan dan siap untuk interaksi. Acara yang menyala di sebagian besar browser saat DOM siap disebut DOMContentLoaded
, bukan DOMContentReady
.
onload
(ada perbedaan wrt FF / IE / Opera). Adapun DOMContentLoaded
, Anda sepenuhnya benar. Editing untuk mengklarifikasi.
document.onload
dapat digunakan). Sejauh window.onload berjalan: window.onload = fn1;window.onload=fn2;
- hanya fn2 yang akan dipanggil onload. Beberapa hosting gratis memasukkan kode mereka sendiri ke dalam dokumen, dan kadang-kadang ini melanggar kode halaman.
$(document).ready()
adalah acara jQuery. $(document).ready()
Metode JQuery dipanggil segera setelah DOM siap (yang berarti bahwa browser telah mem-parsing HTML dan membangun pohon DOM). Ini memungkinkan Anda untuk menjalankan kode segera setelah dokumen siap dimanipulasi.
Misalnya, jika peramban mendukung acara DOMContentLoaded (seperti yang dilakukan banyak peramban non-IE), maka peramban itu akan diaktifkan pada acara itu. (Perhatikan bahwa acara DOMContentLoaded hanya ditambahkan ke IE di IE9 +.)
Dua sintaks dapat digunakan untuk ini:
$( document ).ready(function() {
console.log( "ready!" );
});
Atau versi singkat:
$(function() {
console.log( "ready!" );
});
Poin utama untuk $(document).ready()
:
$
dengan jQuery
ketika Anda menerima "$ tidak ditentukan."$(window).load()
sebagai gantinya. window.onload()
adalah fungsi JavaScript asli. The window.onload()
peristiwa kebakaran ketika semua konten pada halaman Anda telah dimuat, termasuk DOM (dokumen model objek), iklan banner dan gambar. Perbedaan lain antara keduanya adalah bahwa, sementara kita dapat memiliki lebih dari satu $(document).ready()
fungsi, kita hanya dapat memiliki satu onload
fungsi.
Sebuah Windows beban peristiwa kebakaran ketika semua konten pada halaman Anda sepenuhnya dimuat termasuk DOM (dokumen model objek) konten dan asynchronous JavaScript , frame dan gambar . Anda juga dapat menggunakan body onload =. Keduanya sama; window.onload = function(){}
dan <body onload="func();">
berbagai cara menggunakan acara yang sama.
$document.ready
Acara fungsi jQuery dijalankan sedikit lebih awal dari window.onload
dan dipanggil setelah DOM (model objek Dokumen) dimuat pada halaman Anda. Itu tidak akan menunggu untuk gambar, bingkai untuk memuat sepenuhnya .
Diambil dari artikel berikut:
apa $document.ready()
bedanya denganwindow.onload()
$(document).ready(function() {
// Executes when the HTML document is loaded and the DOM is ready
alert("Document is ready");
});
// .load() method deprecated from jQuery 1.8 onward
$(window).on("load", function() {
// Executes when complete page is fully loaded, including
// all frames, objects and images
alert("Window is loaded");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
Kata hati-hati saat menggunakan $(document).ready()
dengan Internet Explorer. Jika permintaan HTTP terputus sebelum seluruh dokumen dimuat (misalnya, saat halaman mengalir ke browser, tautan lain diklik) IE akan memicu $(document).ready
acara.
Jika ada kode dalam $(document).ready()
acara yang mereferensikan objek DOM, ada potensi untuk objek tersebut tidak ditemukan, dan kesalahan Javascript dapat terjadi. Baik menjaga referensi Anda ke objek-objek itu, atau menunda kode yang merujuk objek-objek tersebut ke acara window.load.
Saya belum dapat mereproduksi masalah ini di browser lain (khususnya, Chrome dan Firefox)
Selalu gunakan window.addEventListener
untuk menambahkan acara ke jendela. Karena dengan begitu Anda dapat mengeksekusi kode di berbagai penangan acara.
Kode yang benar:
window.addEventListener('load', function () {
alert('Hello!')
})
window.addEventListener('load', function () {
alert('Bye!')
})
Kode salah:
window.onload = function () {
alert('Hello!') // it will not work!!!
}
window.onload = function () {
alert('Bye!')
}
Ini karena onload hanyalah properti dari objek, yang ditimpa.
Dengan analogi dengan addEventListener
, lebih baik menggunakan $(document).ready()
daripada membebani.
$(document).on('ready', handler)
mengikat ke acara siap dari jQuery. Pawang dipanggil saat DOM dimuat . Aset seperti gambar mungkin masih hilang . Itu tidak akan pernah dipanggil jika dokumen siap pada saat mengikat. jQuery menggunakan DOMContentLoaded -Event untuk itu, meniru jika tidak tersedia.
$(document).on('load', handler)
adalah peristiwa yang akan dipecat setelah semua sumber daya dimuat dari server. Gambar dimuat sekarang. Sementara onload adalah acara HTML mentah, ready dibangun oleh jQuery.
$(document).ready(handler)
sebenarnya adalah janji . Pawang akan dipanggil segera jika dokumen siap pada saat menelepon. Kalau tidak, ia mengikat ke ready
-Event.
Sebelum jQuery 1.8 , $(document).load(handler)
ada sebagai alias untuk $(document).on('load',handler)
.
$.fn.load
itu tidak berlaku sebagai pengikat acara lagi. Bahkan, itu sudah usang sejak jquery 1.8. Saya memperbaruinya sesuai
Ini $(document).ready()
adalah acara jQuery yang terjadi ketika dokumen HTML telah dimuat penuh, sedangkan window.onload
acara terjadi nanti, ketika semuanya termasuk gambar pada halaman dimuat.
Juga window.onload adalah peristiwa javascript murni di DOM, sedangkan $(document).ready()
acara adalah metode di jQuery.
$(document).ready()
biasanya pembungkus untuk jQuery untuk memastikan semua elemen dimuat untuk digunakan dalam jQuery ...
Lihatlah ke kode sumber jQuery untuk memahami cara kerjanya:
jQuery.ready.promise = function( obj ) {
if ( !readyList ) {
readyList = jQuery.Deferred();
// Catch cases where $(document).ready() is called after the browser event has already occurred.
// we once tried to use readyState "interactive" here, but it caused issues like the one
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
setTimeout( jQuery.ready );
// Standards-based browsers support DOMContentLoaded
} else if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", completed, false );
// A fallback to window.onload, that will always work
window.addEventListener( "load", completed, false );
// If IE event model is used
} else {
// Ensure firing before onload, maybe late but safe also for iframes
document.attachEvent( "onreadystatechange", completed );
// A fallback to window.onload, that will always work
window.attachEvent( "onload", completed );
// If IE and not a frame
// continually check to see if the document is ready
var top = false;
try {
top = window.frameElement == null && document.documentElement;
} catch(e) {}
if ( top && top.doScroll ) {
(function doScrollCheck() {
if ( !jQuery.isReady ) {
try {
// Use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
top.doScroll("left");
} catch(e) {
return setTimeout( doScrollCheck, 50 );
}
// detach all dom ready events
detach();
// and execute any waiting functions
jQuery.ready();
}
})();
}
}
}
return readyList.promise( obj );
};
jQuery.fn.ready = function( fn ) {
// Add the callback
jQuery.ready.promise().done( fn );
return this;
};
Saya juga telah membuat gambar di bawah ini sebagai referensi cepat untuk keduanya:
window.onload: Peristiwa JavaScript normal.
document.ready: Peristiwa jQuery tertentu ketika seluruh HTML telah dimuat.
Satu hal yang perlu diingat (atau harus saya katakan recall) adalah Anda tidak bisa menumpuk onload
seperti yang Anda bisa lakukan ready
. Dengan kata lain, sihir jQuery memungkinkan beberapa ready
s pada halaman yang sama, tetapi Anda tidak dapat melakukannya dengan onload
.
Yang terakhir onload
akan menolak semua yang sebelumnya onload
.
Cara yang bagus untuk mengatasinya adalah dengan fungsi yang tampaknya ditulis oleh salah satu dari Simon Willison dan dijelaskan dalam Menggunakan Berbagai Fungsi JavaScript Onload .
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
}
else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
// Example use:
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
addLoadEvent(function() {
/* More code to run on page load */
});
Document.ready
(acara jQuery) akan diaktifkan ketika semua elemen berada di tempatnya, dan mereka dapat direferensikan dalam kode JavaScript, tetapi konten belum tentu dimuat. Document.ready
dieksekusi ketika dokumen HTML dimuat.
$(document).ready(function() {
// Code to be executed
alert("Document is ready");
});
The window.load
namun akan menunggu halaman yang akan dimuat sepenuhnya. Ini termasuk bingkai bagian dalam, gambar, dll.
$(window).load(function() {
//Fires when the page is loaded completely
alert("window is loaded");
});
Peristiwa document.ready sudah terjadi ketika dokumen HTML telah dimuat, dan window.onload
acara terjadi selalu nanti, ketika semua konten (gambar, dll) telah dimuat.
Anda dapat menggunakan document.ready
acara jika Anda ingin melakukan intervensi "awal" dalam proses rendering, tanpa menunggu gambar dimuat. Jika Anda membutuhkan gambar (atau "konten" lainnya) siap sebelum skrip Anda "melakukan sesuatu", Anda harus menunggu sampai window.onload
.
Misalnya, jika Anda menerapkan pola "Peragaan Slide", dan Anda perlu melakukan perhitungan berdasarkan ukuran gambar, Anda mungkin ingin menunggu hingga window.onload
. Jika tidak, Anda mungkin mengalami beberapa masalah acak, tergantung pada seberapa cepat gambar akan dimuat. Script Anda akan berjalan bersamaan dengan utas yang memuat gambar. Jika skrip Anda cukup panjang, atau servernya cukup cepat, Anda mungkin tidak melihat masalah, jika gambar tiba tepat waktu. Tetapi praktik paling aman adalah membiarkan gambar dimuat.
document.ready
bisa menjadi acara yang menyenangkan bagi Anda untuk menunjukkan beberapa tanda "memuat ..." kepada pengguna, dan setelah itu window.onload
, Anda dapat menyelesaikan skrip yang memerlukan sumber daya dimuat, dan akhirnya menghapus tanda "Memuat ...".
Contoh: -
// document ready events
$(document).ready(function(){
alert("document is ready..");
})
// using JQuery
$(function(){
alert("document is ready..");
})
// window on load event
function myFunction(){
alert("window is loaded..");
}
window.onload = myFunction;
window.onload
adalah fungsi bawaan JavaScript. window.onload
memicu ketika halaman HTML dimuat. window.onload
dapat ditulis hanya sekali.
document.ready
adalah fungsi dari perpustakaan jQuery. document.ready
terpicu ketika HTML dan semua kode JavaScript, CSS, dan gambar yang termasuk dalam file HTML dimuat sepenuhnya.
document.ready
dapat ditulis beberapa kali sesuai dengan persyaratan.
Ketika Anda mengatakan $(document).ready(f)
, Anda memberi tahu mesin skrip untuk melakukan hal berikut:
$
dan memilihnya, karena tidak dalam lingkup lokal, ia harus melakukan pencarian tabel hash, yang mungkin atau mungkin tidak memiliki tabrakan.ready
objek yang dipilih, yang melibatkan pencarian tabel hash lain ke objek yang dipilih untuk menemukan metode dan memohonnya.Dalam kasus terbaik, ini adalah 2 tabel hash lookup, tapi itu mengabaikan pekerjaan berat yang dilakukan oleh jQuery, di mana $
kitchen sink dari semua input yang mungkin untuk jQuery, jadi peta lain kemungkinan ada untuk mengirimkan kueri ke handler yang benar.
Atau, Anda bisa melakukan ini:
window.onload = function() {...}
yang mana akan
onload
properti atau tidak dengan melakukan pencarian tabel hash, karena itu, itu disebut seperti fungsi.Dalam kasus terbaik, ini membutuhkan pencarian tabel hash tunggal, yang diperlukan karena onload
harus diambil.
Idealnya, jQuery akan mengkompilasi kueri mereka ke string yang dapat ditempelkan untuk melakukan apa yang Anda inginkan jQuery tetapi tanpa runtime dispatching dari jQuery. Dengan cara ini Anda memiliki opsi untuk keduanya
eval
.window.onload disediakan oleh DOM api dan ia mengatakan "acara memuat menyala ketika sumber daya yang diberikan telah dimuat".
"Acara memuat diaktifkan pada akhir proses pemuatan dokumen. Pada titik ini, semua objek dalam dokumen berada di DOM, dan semua gambar, skrip, tautan, dan sub-bingkai telah selesai dimuat." DOM memuat
Tetapi dalam jQuery $ (document) .ready () hanya akan berjalan setelah halaman Document Object Model (DOM) siap untuk dieksekusi kode JavaScript. Ini tidak termasuk gambar, skrip, iframe dll. Jquery ready event
Jadi metode siap jquery akan berjalan lebih awal dari acara dom onload.