Puro equivalente JavaScript di $.ready() di jQuery - come chiamare una funzione quando la pagina/DOM è pronta per essa
Ok, questa potrebbe essere solo una domanda stupida, anche se sono sicuro che ci sono molte altre persone che fanno la stessa domanda di tanto in tanto. Io, voglio solo essere sicuro al 100% in ogni caso. Con jQuery conosciamo tutti il meraviglioso
$('document').ready(function(){});
Tuttavia, diciamo che voglio eseguire una funzione che è scritta in JavaScript standard senza alcuna libreria di supporto, e che voglio lanciare una funzione non appena la pagina è pronta a gestirla. Qual è il modo corretto di avvicinarsi a questo?
So che posso fare:
window.onload="myFunction()";
...o posso usare il tag body
:
<body onload="myFunction()">
...o posso anche provare in fondo alla pagina dopo tutto, ma alla fine body
o html
tag come:
<script type="text/javascript">
myFunction();
</script>
Qual è un metodo cross-browser (vecchio/nuovo) compatibile con l'emissione di una o più funzioni in un modo come jQuery's $.ready()
?
La cosa più semplice da fare in assenza di un framework che faccia tutta la compatibilità cross-browser per te è semplicemente mettere una chiamata al tuo codice alla fine del corpo. Questo è più veloce da eseguire di un gestore
onload
perché questo aspetta solo che il DOM sia pronto, non che tutte le immagini vengano caricate. E questo funziona in ogni browser.Per i browser moderni (qualsiasi cosa da IE9 in poi e qualsiasi versione di Chrome, Firefox o Safari), se volete essere in grado di implementare un metodo jQuery come
$(document).ready()
che potete chiamare da qualsiasi luogo (senza preoccuparvi di dove sia posizionato lo script chiamante), potete semplicemente usare qualcosa come questo:Uso:
Se hai bisogno di piena compatibilità cross-browser (incluse le vecchie versioni di IE) e non vuoi aspettare il
window.onload
, allora probabilmente dovresti andare a vedere come un framework come jQuery implementa il suo metodo$(document).ready()
. È abbastanza complicato a seconda delle capacità del browser.Per darvi una piccola idea di cosa fa jQuery (che funzionerà ovunque sia posizionato il tag script).
Se supportato, prova lo standard:
con un fallback a:
o per le vecchie versioni di IE, usa:
con un fallback a:
E, ci sono alcuni work-around nel percorso del codice di IE che non seguo bene, ma sembra che abbia qualcosa a che fare con i frame.
Qui c'è un sostituto completo di jQuery
.ready()
scritto in semplice javascript:L'ultima versione del codice è condivisa pubblicamente su GitHub all'indirizzo https://github.com/jfriend00/docReady
Utilizzo:
Questo è stato testato in:
lingua: lang-none -->
Implementazione di lavoro e banco di prova: http://jsfiddle.net/jfriend00/YfD3C/
Ecco un riassunto di come funziona:
docReady(fn, context)
.docReady(fn, context)
viene chiamata, controlla se il gestore ready ha già sparato. Se è così, basta programmare il callback appena aggiunto per sparare subito dopo che questo thread di JS finisce consetTimeout(fn, 1)
.document.addEventListener
esiste, allora installa i gestori di eventi usando.addEventListener()
per entrambi gli eventi"DOMContentLoaded"
e"load"
. L'evento "load" è un evento di riserva per sicurezza e non dovrebbe essere necessario.document.addEventListener
non esiste, allora installa gestori di eventi usando.attachEvent()
per gli eventi"onreadystatechange"
e"onload"
.onreadystatechange
, controlla se ildocument.readyState === "complete"
e se è così, chiama una funzione per sparare tutti i gestori pronti.I gestori registrati con
docReady()
sono garantiti per essere lanciati nell'ordine in cui sono stati registrati.Se si chiama
docReady(fn)
dopo che il documento è già pronto, il callback sarà programmato per essere eseguito non appena il thread di esecuzione corrente si concluderà usandosetTimeout(fn, 1)
. Questo permette al codice chiamante di assumere sempre che siano callback asincroni che saranno chiamati più tardi, anche se più tardi è appena il thread corrente di JS finisce e conserva l'ordine di chiamata.Il tuo metodo (mettere lo script prima del tag di chiusura del corpo)
è un modo affidabile per supportare i vecchi e i nuovi browser.
document.ondomcontentready=function(){}
dovrebbe fare il trucco, ma non ha piena compatibilità con i browser.Sembra che dovresti semplicemente usare jQuery min