Quali sono le differenze tra window.onload
il $(document).ready()
metodo JavaScript e il metodo jQuery ?
$().ready()
fa fuoco dopo, window.onload
a volte.
Quali sono le differenze tra window.onload
il $(document).ready()
metodo JavaScript e il metodo jQuery ?
$().ready()
fa fuoco dopo, window.onload
a volte.
Risposte:
L' ready
evento si verifica dopo che il documento HTML è stato caricato, mentre l' onload
evento si verifica in seguito, quando è stato caricato anche tutto il contenuto (ad es. Immagini).
L' onload
evento è un evento standard nel DOM, mentre l' ready
evento è specifico di jQuery. Lo scopo ready
dell'evento è che dovrebbe verificarsi il prima possibile dopo il caricamento del documento, in modo che il codice che aggiunge funzionalità agli elementi nella pagina non debba attendere il caricamento di tutto il contenuto.
ready
evento è specifico di jQuery. Sta usando l' DOMContentLoaded
evento se è disponibile nel browser, altrimenti lo emula. Non esiste un equivalente esatto nel DOM perché l' DOMContentLoaded
evento non è supportato in tutti i browser.
onload
. onload
è il nome di una proprietà dell'oggetto che memorizza una funzione da invocare quando load
viene attivato l' evento.
window.onload
è l'evento JavaScript incorporato, ma poiché la sua implementazione ha avuto strane imperfezioni tra i browser (Firefox, Internet Explorer 6, Internet Explorer 8 e Opera ), fornisce jQuery document.ready
, che li astrae e si attiva non appena il DOM della pagina è pronto (non aspetta immagini, ecc.).
$(document).ready
(nota che non lo è document.ready
, che non è definito) è una funzione jQuery, che avvolge e fornisce coerenza ai seguenti eventi:
document.ondomcontentready
/ document.ondomcontentloaded
- un evento newish che si attiva quando viene caricato il DOM del documento (che potrebbe essere un po 'di tempo prima che vengano caricate le immagini, ecc.); di nuovo, leggermente diverso in Internet Explorer e nel resto del mondowindow.onload
(che è implementato anche nei vecchi browser), che si attiva quando viene caricata l'intera pagina (immagini, stili, ecc.)load
evento di window
è implementato in modo abbastanza coerente in tutti i browser. Il problema che jQuery e le altre librerie stanno cercando di risolvere è quello che hai citato, ovvero che l' load
evento non viene generato fino a quando non sono state caricate tutte le risorse dipendenti come immagini e fogli di stile, il che potrebbe richiedere molto tempo dopo il caricamento completo del DOM, reso e pronto per l'interazione. L'evento che gli incendi in maggior parte dei browser quando il DOM è pronto si chiama DOMContentLoaded
, non è DOMContentReady
.
onload
(ci sono differenze tra FF / IE / Opera). Per quanto riguarda il DOMContentLoaded
, hai completamente ragione. Modifica per chiarire.
document.onload
era utilizzabile). Per quanto riguarda window.onload: window.onload = fn1;window.onload=fn2;
- solo fn2 verrebbe invocato al caricamento. Alcuni webhost gratuiti inseriscono il proprio codice nei documenti e talvolta questo ha bloccato il codice in-page.
$(document).ready()
è un evento jQuery. Il $(document).ready()
metodo di JQuery viene chiamato non appena il DOM è pronto (il che significa che il browser ha analizzato l'HTML e creato l'albero del DOM). Ciò consente di eseguire il codice non appena il documento è pronto per essere manipolato.
Ad esempio, se un browser supporta l'evento DOMContentLoaded (come fanno molti browser non IE), verrà attivato su quell'evento. (Si noti che l'evento DOMContentLoaded è stato aggiunto a IE solo in IE9 +.)
A tale scopo è possibile utilizzare due sintassi:
$( document ).ready(function() {
console.log( "ready!" );
});
O la versione abbreviata:
$(function() {
console.log( "ready!" );
});
Punti principali per $(document).ready()
:
$
con jQuery
quando ricevi "$ non definito."$(window).load()
invece. window.onload()
è una funzione JavaScript nativa. L' window.onload()
evento viene generato quando tutti i contenuti della tua pagina sono stati caricati, inclusi DOM (modello a oggetti del documento), banner pubblicitari e immagini. Un'altra differenza tra i due è che, mentre possiamo avere più di una $(document).ready()
funzione, possiamo avere solo una onload
funzione.
Un evento di caricamento di Windows viene generato quando tutto il contenuto della pagina è completamente caricato, incluso il contenuto DOM (modello a oggetti documento) e JavaScript asincrono , frame e immagini . Puoi anche usare body onload =. Entrambi sono uguali; window.onload = function(){}
e <body onload="func();">
sono modi diversi di utilizzare lo stesso evento.
L'$document.ready
evento della funzione jQuery viene eseguito un po 'prima di window.onload
e viene chiamato una volta caricato il DOM (modello a oggetti del documento) sulla pagina. Non aspetterà che le immagini, i frame vengano caricati completamente .
Tratto dal seguente articolo:
come $document.ready()
è diverso dawindow.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>
Un avvertimento sull'utilizzo $(document).ready()
con Internet Explorer. Se una richiesta HTTP viene interrotta prima che venga caricato l'intero documento (ad esempio, mentre una pagina viene trasmessa in streaming al browser, viene fatto clic su un altro collegamento) IE attiverà l' $(document).ready
evento.
Se un codice all'interno $(document).ready()
dell'evento fa riferimento a oggetti DOM, esiste la possibilità che tali oggetti non vengano trovati e possono verificarsi errori Javascript. O proteggi i tuoi riferimenti a quegli oggetti o differisci il codice che fa riferimento a quegli oggetti all'evento window.load.
Non sono stato in grado di riprodurre questo problema in altri browser (in particolare, Chrome e Firefox)
Usa sempre il window.addEventListener
per aggiungere un evento alla finestra. Perché in questo modo è possibile eseguire il codice in diversi gestori di eventi.
Codice corretto:
window.addEventListener('load', function () {
alert('Hello!')
})
window.addEventListener('load', function () {
alert('Bye!')
})
Codice non VALIDO:
window.onload = function () {
alert('Hello!') // it will not work!!!
}
window.onload = function () {
alert('Bye!')
}
Questo perché onload è solo proprietà dell'oggetto, che viene sovrascritto.
Per analogia con addEventListener
, è meglio usare $(document).ready()
piuttosto che onload.
$(document).on('ready', handler)
si lega all'evento pronto da jQuery. Il gestore viene chiamato quando viene caricato il DOM . Risorse come le immagini forse mancano ancora . Non verrà mai chiamato se il documento è pronto al momento della rilegatura. jQuery utilizza DOMContentLoaded -Event per questo, emulandolo se non disponibile.
$(document).on('load', handler)
è un evento che verrà generato una volta caricate tutte le risorse dal server. Le immagini sono caricate ora. Mentre onload è un evento HTML non elaborato, ready è creato da jQuery.
$(document).ready(handler)
in realtà è una promessa . Il gestore verrà chiamato immediatamente se il documento è pronto al momento della chiamata. Altrimenti si lega a ready
-Event.
Prima di jQuery 1.8 , $(document).load(handler)
esisteva come alias di $(document).on('load',handler)
.
$.fn.load
che non si comporti più come raccoglitore di eventi. In effetti, è obsoleto dal jquery 1.8. L'ho aggiornato di conseguenza
Il $(document).ready()
è un jQuery evento che si verifica quando il documento HTML è stato completamente caricato, mentre l' window.onload
evento si verifica più tardi, quando tutto, compreso le immagini sulla pagina caricata.
Anche window.onload è un evento javascript puro nel DOM, mentre l' $(document).ready()
evento è un metodo in jQuery.
$(document).ready()
di solito è il wrapper per jQuery per assicurarsi che tutti gli elementi caricati vengano utilizzati in jQuery ...
Guarda il codice sorgente di jQuery per capire come funziona:
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;
};
Inoltre ho creato l'immagine qui sotto come riferimento rapido per entrambi:
window.onload: un normale evento JavaScript.
document.ready: un evento jQuery specifico quando l'intero HTML è stato caricato.
Una cosa da ricordare (o dovrei dire ricordare) è che non puoi impilare onload
s come puoi ready
. In altre parole, jQuery magic consente più ready
s sulla stessa pagina, ma non puoi farlo con onload
.
L'ultimo onload
avrà la precedenza su tutti i precedenti onload
.
Un buon modo per gestirlo è con una funzione apparentemente scritta da un Simon Willison e descritta in Utilizzo di più funzioni 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
(un evento jQuery) verrà attivato quando tutti gli elementi sono presenti e possono essere indicati nel codice JavaScript, ma il contenuto non viene necessariamente caricato. Document.ready
viene eseguito quando viene caricato il documento HTML.
$(document).ready(function() {
// Code to be executed
alert("Document is ready");
});
Il window.load
tuttavia aspetterà la pagina da pieno carico. Ciò include cornici interne, immagini, ecc.
$(window).load(function() {
//Fires when the page is loaded completely
alert("window is loaded");
});
L'evento document.ready si verifica quando il documento HTML è stato caricato e l' window.onload
evento si verifica sempre più tardi, quando è stato caricato tutto il contenuto (immagini, ecc.).
È possibile utilizzare l' document.ready
evento se si desidera intervenire "in anticipo" nel processo di rendering, senza attendere il caricamento delle immagini. Se hai bisogno che le immagini (o qualsiasi altro "contenuto") siano pronte prima che lo script "faccia qualcosa", devi aspettare fino a quando window.onload
.
Ad esempio, se stai implementando un modello "Presentazione" e devi eseguire calcoli basati sulle dimensioni dell'immagine, potresti voler aspettare fino a window.onload
. Altrimenti, potresti riscontrare alcuni problemi casuali, a seconda della velocità con cui verranno caricate le immagini. Il tuo script verrebbe eseguito contemporaneamente al thread che carica le immagini. Se lo script è abbastanza lungo o il server è abbastanza veloce, potresti non notare un problema se le immagini arrivano in tempo. Ma la pratica più sicura sarebbe consentire il caricamento delle immagini.
document.ready
potrebbe essere un piacevole evento per mostrare agli utenti alcuni segni di "caricamento in corso ..." e, successivamente window.onload
, è possibile completare qualsiasi script che necessitasse di risorse caricate, quindi rimuovere il segno "Caricamento in corso ...".
Esempi: -
// 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
è una funzione integrata di JavaScript. window.onload
trigger quando viene caricata la pagina HTML. window.onload
può essere scritto una sola volta.
document.ready
è una funzione della libreria jQuery. document.ready
si innesca quando HTML e tutto il codice JavaScript, CSS e immagini inclusi nel file HTML sono completamente caricati.
document.ready
può essere scritto più volte in base alle esigenze.
Quando dici $(document).ready(f)
, dici al motore di script di fare quanto segue:
$
e selezionalo, poiché non è nell'ambito locale, deve eseguire una ricerca nella tabella hash, che può avere o meno collisioni.ready
dell'oggetto selezionato, che comporta un'altra ricerca nella tabella hash nell'oggetto selezionato per trovare il metodo e invocarlo.Nel migliore dei casi, si tratta di 2 ricerche nella tabella hash, ma questo ignora il pesante lavoro svolto da jQuery, dove $
trova il lavello della cucina di tutti i possibili input per jQuery, quindi è probabile che un'altra mappa invii la query al gestore corretto.
In alternativa, puoi farlo:
window.onload = function() {...}
quale sarà
onload
è una proprietà oppure no eseguendo una ricerca nella tabella hash, poiché lo è, si chiama come una funzione.Nel migliore dei casi, questo costa una singola ricerca nella tabella hash, che è necessaria perché onload
deve essere recuperata.
Idealmente, jQuery dovrebbe compilare le proprie query in stringhe che possono essere incollate per fare ciò che si desidera che jQuery faccia, ma senza l'invio di runtime di jQuery. In questo modo hai un'opzione di entrambi
eval
.window.onload è fornito dall'API DOM e indica "l'evento load viene generato quando una determinata risorsa è stata caricata".
"L'evento di caricamento viene generato alla fine del processo di caricamento del documento. A questo punto, tutti gli oggetti nel documento si trovano nel DOM e tutte le immagini, gli script, i collegamenti e i frame secondari hanno terminato il caricamento." Onload DOM
Ma in jQuery $ (document) .ready () verrà eseguito solo quando la pagina Document Object Model (DOM) è pronta per l'esecuzione del codice JavaScript. Questo non include immagini, script, iframe ecc. Jquery ready event
Quindi il metodo jquery ready verrà eseguito prima dell'evento onload dom.