Firefox, Opera et les navigateurs basés sur Webkit ont un événement au niveau du document. DOMContentLoaded
que vous pouvez écouter avec document.addEventListener("DOMContentLoaded", fn, false)
.
C'est plus compliqué dans IE. Ce que fait jQuery dans IE, c'est regarder onreadystatechange
sur l'objet document pour un état de lecture particulier avec une sauvegarde de l'événement document.onload. document.onload se déclenche plus tard que le DOM est prêt (seulement quand toutes les images ont fini de se charger) donc il est seulement utilisé comme un filet de sécurité au cas où les événements précédents ne fonctionnent pas pour une raison quelconque.
Si vous passez un peu de temps sur Google, vous trouverez du code pour faire cela. Je pense que le code le plus éprouvé pour ce faire se trouve dans les grands frameworks comme jQuery et YUI. Ainsi, même si je n'utilise pas ce framework, je cherche des techniques dans son code source.
Voici la partie principale de la source de jQuery 1.6.2 pour document.ready()
:
bindReady: function() {
if ( readyList ) {
return;
}
readyList = jQuery._Deferred();
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
return setTimeout( jQuery.ready, 1 );
}
// Mozilla, Opera and webkit nightlies currently support this event
if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
// A fallback to window.onload, that will always work
window.addEventListener( "load", jQuery.ready, false );
// If IE event model is used
} else if ( document.attachEvent ) {
// ensure firing before onload,
// maybe late but safe also for iframes
document.attachEvent( "onreadystatechange", DOMContentLoaded );
// A fallback to window.onload, that will always work
window.attachEvent( "onload", jQuery.ready );
// If IE and not a frame
// continually check to see if the document is ready
var toplevel = false;
try {
toplevel = window.frameElement == null;
} catch(e) {}
if ( document.documentElement.doScroll && toplevel ) {
doScrollCheck();
}
}
},
3 votes
El
document.readyState
peut être utilisée, bien que je ne sois pas sûr de la compatibilité avec les navigateurs...1 votes
Pas très bon, j'en ai peur. :(
5 votes
Avoir vous a essayé à recherche ?
1 votes
Voir ce petit utilitaire : github.com/cms/domready c'est environ ~0.5kb minifié.
1 votes
@DigitalPlane - Je retire ce que j'ai dit. Le support du navigateur est sacrément bon ! Ajoutez-le comme réponse et je l'accepterai.
1 votes
Dans ce cas, je retirerai la réponse acceptée et l'attribuerai à quelqu'un d'autre. :)