Bonjours à tous,
Aprés avoir tourné ce probléme dans plusieurs sens, j'ai fini par employer cette solution qui me semble la plus simple:
function init() {
if(!document.getElementById || !document.createElement)return;
if (arguments.callee.done) return;
arguments.callee.done = true;
startEvents();
}
/* for Mozilla & Opera*/
if (document.addEventListener) {
document.addEventListener("DOMContentLoaded", init, false);
}
/* For Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
var _timer = setInterval(function() {
if (/loaded|complete/.test(document.readyState)) {
clearInterval(_timer);
init();
}
}, 10);
}
window.onload = init;
Comme vous remarquerez, je n'ai rien inventé c'est exactement celle de Dan Edwards. Vous remarquerez aussi qu' il n'y a pas le code étrange pour ie. En fait je le rejoute dans le html de la façon suivante:
<!--[if IE 6]>
<link href="squelettes/styles/design_ie.css" rel="stylesheet" type="text/css" />
<script defer type="text/javascript" src="scripts/load_ie.js"></script>
<![endif]-->
C'est beaucoup plus clair à mon goût est comme il y en général un feuille de style pour ie, cela ne fait qu'un ligne de code à rajouter au lieu de 10 lignes de signe chinois, de plus si vous avez un script spécial pour ie6 (comme le support du png, que j'utilise quasiment tout le temps) vous pouvez de cette maniére ne l'adresser qu'à ie6, comme ça:
<!--[if lte IE 6]>
<link href="squelettes/styles/design_ie.css" rel="stylesheet" type="text/css" />
<script defer type="text/javascript" src="scripts/load_ie6.js"></script>
<![endif]-->
<!--[if gte IE 7]>
<script defer type="text/javascript" id="ie7" src="scripts/load_ie7.js"></script>
<![endif]-->
Du coup ie 7 ne se tape pas le script du png pour ie6, et c'est super de pouvoir faire ces logos ou titres en png
.
Donc je nomme ce script load.js et je le met dés que j'utilise js.
Comme j'utilise des scripts différents celon les pages, je met ça en haut de mes pages xhtml:
<script type="text/javascript" src="scripts/load.js"></script>
<script type="text/javascript" src="scripts/fonctiondelapage.js"></script>
<script type="text/javascript">
<!--
function startEvents(){
initMachin();
initTruc();
}
//-->
</script>
ça permet de charger et d'executer exactement et seulement ce qu'on à envie, et d'être sur que se soit charger avant les images et les flashs sur les navigateurs principaux. Jusque là je n'ai pas eu de bug de la méthode. Par contre quand j'utilise des scripts externes, je cherche la fonction init pour le rajouter à ma liste. Je pense que c'est mieux que "addEvent" parceque ça permet de faire profiter de la méthode de chargement "immediat" à tout les scripts de la page.
Un autre méthode est d'utiliser les behaviors, mais c'est un poil plus lent au chargement et un poil plus compliqué (on voit un cour instant les png gris par exemple).
Par exemple
sur cette page l'idée c'était de faire quelquechose de trés doux, avec des coins arrondis (avec niftyCube), des affichages progressifs et des titres en png, ce sont normalment que des techniques lourdes et pénible à utiliser mais sur cette page toute simple cela passe plutot bien et cela a était trés rapide à faire (surtout les coins arrondis
, 30 minutes) grâce à cette technique. Par exemple avant je n'utilisait pas niftyCube à cause de l'effet de décalage puis de saut à chargement, avec cette technique c'est déjà mieux. Sur d'autre site j'ai des flash un peu lourd et pourtant tout les comportements dynamique sont casi imediatement disponibles.
Modifié par matmat (22 Feb 2007 - 04:48)