11548 sujets

JavaScript, DOM et API Web HTML5

Bonjour,

Je charge une fonction JS dans une div "contenu" en bas d'une page html.
Je remonte cette div "contenu" via un "replaceChild" en haut de la page dans une div "conteneur", comme ceci :


<html>
<body>
<div id="conteneur"><div></div></div>

...

<div id="contenu">
	<script type="text/javascript">
		javascriptFunction(params);
	</script>
</div>
	
<script type="text/javascript">
			document.getElementById('conteneur').replaceChild(document.getElementById('contenu'), document.getElementById('conteneur').firstChild);
</script>
</body>
</html>


Le problème est que sur IE 6 (ou 7) il charge 2 fois la fonction Javascript : une première fois (normalement) dans la div contenu. Mais il appelle une deuxième fois cette fonction JS lorsqu'il déplace l'élément "contenu" dans le "conteneur" avec la méthode replaceChild.

Comment faire pour qu'il ne charge qu'une seule fois la fonction JS, comme le fait par ailleurs Firefox ?

Merci
Bonjour,

Je ne connais pas les specs à ce sujet, mais le comportement d'IE ne parait pas déconnant, puisque le script fait a priori partie de l'arbre DOM, on peut donc comprendre qu'il soit réinterprété quand il est déplacé. Pourquoi ne pas faire en sorte de placer ce <script> dans le <head> ?
Modifié par Eldebaran (14 Dec 2006 - 17:05)
parce que, placé dans le head, il bloquerait le chargement de la page (ce script JS appelle des pub longues à répondre).

Le comportement d'IE n'est peut-être pas déconnant, mais celui de FFox -pour cet exemple précis- est plus cohérent, puisqu'il ne récharge pas après déplacement ce qu'il a déjà chargé une fois et que le double chargement du script perturbe mes stats...
nico1000 a écrit :
parce que, placé dans le head, il bloquerait le chargement de la page (ce script JS appelle des pub longues à répondre).
Pas si tu utilises un gestionnaire d'événements pour le lancer au chargement de ta page.

Sinon, tu peux sans doute supprimer le script de l'arbre DOM avant de bouger ton div.
oui, le gestionnaire d'événement est un peu plus compliqué ;

et à ce sujet :

"Sinon, tu peux sans doute supprimer le script de l'arbre DOM avant de bouger ton div."

=>et remettre le script une fois déplacé ? (pour qu'il affiche ce qu'il a à afficher).
mais quand je vais le remettre, IE risque de le recharger ?

Peux-tu expliciter ton idée ?
Merci
nico1000 a écrit :
"Sinon, tu peux sans doute supprimer le script de l'arbre DOM avant de bouger ton div."

=>et remettre le script une fois déplacé ? (pour qu'il affiche ce qu'il a à afficher).
mais quand je vais le remettre, IE risque de le recharger ?
En fait, je ne suis pas sûr d'avoir compris ton besoin.

Quand tu déplaces ton <div>, que veux-tu qu'il se passe exactement ? Aurais-tu un exemple un peu plus précis ?
Pardon, alors je reprends, en essayant d'être plus clair.

La div déplacée contient un JS qui affiche une bannière (via un adServer). Or l'adServer met du temps à envoyer la bannière.
Je souhaite donc charger le JS en bas de page pour ne pas bloquer le chargement du reste de la page, mais comme il s'agit d'une bannière, j'ai besoin de remonter la div en haut de page.

Le problème est donc que IE charge 2 fois le JS (une fois en bas de page, une fois au déplacement replaceChild) et compte 2 affichages du point de vue statistique.

Merci de ton aide.