Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Contribuez
Contribuez Proposez vos articles, cours, tutoriels, questions/réponses pour les FAQ, sources et autres ressources pour la rubrique Web ainsi que ses sous-rubriques.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/06/2007, 19h29   #1
Membre éprouvé
 
Avatar de yjuliet
 
Homme Yvan
Consultant informatique
Inscription : août 2006
Messages : 360
Détails du profil
Informations personnelles :
Nom : Homme Yvan
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : août 2006
Messages : 360
Points : 402
Points : 402
Par défaut [DOM] Ajout d'éléments à un élément parent.

Suite à une galère de quelques jours, je voulais juste partager une petite expérience sur un bug étrange d'Internet Explorer...

Lorsque vous voulez ajouter un noeud à élément de votre page (un noeud DOM), si le script qui gère cet ajout n'est pas un fils direct ou en dehors du noeud dans lequel on veut ajouter l'élément, lors de l'ajout (parent.appendChild(newElement)), Internet explorer va afficher une page d'erreur au lieu du contenu de la page réellement générée, indiquant que le serveur est introuvable à cause d'un problème DNS.

J'ai testé sous IE 6 et 7 sous XP SP2 et tous les 2 étaient impactés. J'ai aussi testé d'autres navigateurs pour voir si ils étaient impactés et le résultat a été clair aucun problème pour Firefox 2 ni Safari 3 (pour Windows).
N'ayant pas d'autres navigateurs sous la main, je me suis contenté de ceux-ci.

Voici donc un exemple de code pour vérifier sur votre version d'Internet Explorer :
Code html :
1
2
3
4
5
6
7
8
9
10
11
<html>
<body>
<div id="myId">
  <div>
    <script type="text/javascript"><!--
document.getElementById("myId").appendChild(document.createElement("div"));
    // --></script>
  </div>
</div>
</body>
</html>
La seule parade que j'ai trouvée était de déplacer les scripts en fonction des besoins le plus proche possible de la racine XML.
__________________
yjuliet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2007, 09h12   #2
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 119
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 119
Points : 45 280
Points : 45 280
Ce qui est d'autatn plus curieux c'est que c'est non seulement l'appendChild qui pose problème mais en plus la position du nouvel élément ???
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 
<html>
<body>
<div id="myId">
  <div id="child" style='border: solid 3px green; height:20px;'>
    <script type="text/javascript"><!--
    var newElt=document.createElement("div")
    newElt.style.border="solid 3px red"
    newElt.style.height="20px"
    newElt.id='new'
    var container=document.getElementById("myId")
    container.insertBefore(newElt,document.getElementById('child'));
    //contianer.insertBefore(document.getElementById('child'),document.getElementById('new') )   // --></script>
  </div>
</div>
</body>
</html>
Le insertBefore ne pose pas de problème...
mais si l'on essaye d'inverser l'ordre il se passer le même bug ???
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2007, 11h55   #3
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 119
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 119
Points : 45 280
Points : 45 280
La lumière nous vient de Auteur !

Il m'a fait remarqué que en fait au moment de l'execution du script les balises de fermeture des div ne sont pas encore interprétées ...

voici donc comment résoudre ce petit problème :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<body>
<div id="myId">
  <div id="child" style='border: solid 3px green; height:20px;'>
    <script type="text/javascript"><!--
    var newElt=document.createElement("div")
    newElt.style.border="solid 3px red"
    newElt.style.height="20px"
    newElt.id='new'
    var container=document.getElementById("myId")
    setTimeout(function(){container.appendChild(newElt)})
      // -->
 
     </script>
  </div>
</div>
 
</body>
</html>
et du coup les balises des divs sont fermées ...
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2007, 12h05   #4
Expert Confirmé Sénior
 
Avatar de Auteur
 
Inscription : avril 2004
Messages : 4 796
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 4 796
Points : 5 119
Points : 5 119
Spaceforg : bah, c'est la seule explication que j'ai trouvée... Dans l'exemple de yjuliet le code s'execute avant la fermeture du div parent... Comme le parent n'est pas fermé, on ne peut pas ajouter d'élément à la fin.

Par contre, tu as oublié de préciser le second paramètre dans le setTimeout (la temporisation). C'est normal ?



et pour l'insertBefore :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
<div id="myId">
  <div id="child" style='border: solid 3px green; height:20px;'>
    <script type="text/javascript"><!--
    var newElt=document.createElement("div")
    newElt.style.border="solid 3px red"
    newElt.style.height="20px"
    newElt.id='new'
    var container=document.getElementById("myId")
    container.insertBefore(newElt,document.getElementById('child'));
    //container.insertBefore(document.getElementById('child'),document.getElementById('new') )   // --></script>
  </div>
</div>
tu peux insérer avant le child car au moment de l'exécution du script la balise
ouvrante <div id="child"> existe (même si les balises </div> des div du child et du conteneur ne sont pas encore interprétées).

J'en suis arrivé à cette explication car lorsque l'on sort le script du conteneur :
Code html :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
<html>
<head>
<title></title>
</head>
 
<body>
 
  <div id="myId">
  conteneur
    <div>mon texte
 
    </div>
  </div>
 
    <script type="text/javascript"><!--
    var el = document.createElement("div");
    var c = document.getElementById("myId");
    el.innerHTML = "coucou";
    el.style.border="solid 3px red";
    c.appendChild(el);
    // -->
    </script>
 
 
</body>
</html>
Cela ne pose aucun problème.
Auteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2007, 12h55   #5
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 119
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 119
Points : 45 280
Points : 45 280
peut on simplement dire en conclusion qu'il s'agit d'un problème d'instanciation d'objet ?

pour le paramètre manquant... non c'est eun erreur ... mais ça à l'aire de focntionner quand même ... ce qui voudrait dire que c'est une question de milliseconde ?
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2007, 15h13   #6
Expert Confirmé Sénior
 
Avatar de Auteur
 
Inscription : avril 2004
Messages : 4 796
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 4 796
Points : 5 119
Points : 5 119
Citation:
Envoyé par SpaceFrog
peut on simplement dire en conclusion qu'il s'agit d'un problème d'instanciation d'objet ?
sans doute... Ceci dit je ne considère pas le comportement de IE comme un bug en tant que tel.

Citation:
pour le paramètre manquant... non c'est eun erreur ... mais ça à l'aire de focntionner quand même ... ce qui voudrait dire que c'est une question de milliseconde ?
euh là... je ne serai pas aussi catégorique : dans ces exemples, il ya "juste" trois lignes de code dans le div. Mais si après le script tu insères des éléments qui sont longs à charger (include PHP, requête Ajax, images,...), je ne suis pas sûr que le div (c'est à dire un élément <div>....</div>) soit créé en quelques millisecondes.
Auteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2007, 16h08   #7
Responsable Modération
 
Homme
Inscription : janvier 2007
Messages : 9 315
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2007
Messages : 9 315
Points : 15 609
Points : 15 609
Citation:
Envoyé par yjuliet
ou en dehors du noeud dans lequel on veut ajouter l'élément, lors de l'ajout (parent.appendChild(newElement)), Internet explorer va afficher une page d'erreur ....
Du coup, j'ai une question (certainement bête) :
quel est l'intérêt d'un script "dans la page", par rapport à un lancement via le traditionnel onload ?
Il sera bien en dehors du noeud en question, et du coup, ça enlève tout interrogation sur le timeout à prévoir (qui me semble de toutes façons bien aléatoire, pour les raisons données par Auteur ... auquelles je rajoute mon cas perso : les petits veinard qui ont la joie de voir les pages se contruire sous leurs yeux gràce à un modem 56K, et pour lesquels il faut rajouter 2 zéro au timeout prévu).

... enfin, je demande ça surtout parce que j'aime pas mettre des scripts dans le body
E.Bzz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2007, 16h50   #8
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 119
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 119
Points : 45 280
Points : 45 280
en fait la seule justification que je verrasi à cela serait pour ajouter des scripts javascript avec des includes en php ?
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2007, 19h19   #9
Expert Confirmé
 
Avatar de FremyCompany
 
Étudiant
Inscription : février 2006
Messages : 2 532
Détails du profil
Informations personnelles :
Âge : 20

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : février 2006
Messages : 2 532
Points : 2 903
Points : 2 903
Envoyer un message via MSN à FremyCompany
Regardez comment faire ce que vous voulez sans timeout, sans onload, sans trucs sans broc et sans machin non plus

Code :
1
2
3
4
5
6
<div id="divResult">Voici le résultat du script :<br/></div>
<script>
document.getElementById("divResult").appendChild(
  document.createTextNode("1+1=2")
);
</script>
En effet, IE ne peut pas ajouter un noed à un objet qui n'a pas fini d'être bindé !

Sinon, vous avez tjrs document.write qui fait ca mais moi j'aime pas trop donc...
__________________
Fremy
Pour vos développements Web et une navigation agréable, le tout gratuit :
1) IE 8 + IE7Pro (Si vous ne connaissez pas IE7Pro, essayez !)
2) FF 3 + Web Developper Toolbar + AdBlockPlus + FireBug + GreaseMonkey
FremyCompany est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2007, 21h01   #10
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 119
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 119
Points : 45 280
Points : 45 280
oui bien sur Fremy nous en étions tous là ...
il est bien entendu évident qu'en sortant le script de l'objet il n'y a aucun souci ...
le chalenge était 1 de comprendre la cause de l'erreur et 2 d'arriver à le faire fonctionner sans bouger le script ...

le plus simple est encore de mettre une fonction dans le head et de la lancer sur le onload ...
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 12h55   #11
Membre éprouvé
 
Avatar de yjuliet
 
Homme Yvan
Consultant informatique
Inscription : août 2006
Messages : 360
Détails du profil
Informations personnelles :
Nom : Homme Yvan
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : août 2006
Messages : 360
Points : 402
Points : 402
Citation:
Envoyé par Auteur
sans doute... Ceci dit je ne considère pas le comportement de IE comme un bug en tant que tel.
Ce que je considère comme un bug c'est l'erreur retournée, pas le fait que le script provoque une erreur en soi.
Si il me disait "le noeud n'existe pas, ou n'est pas un objet, ou ...", ça me conviendrait, mais le problème est qu'il me redirige vers une page "server not found" laissant penser à une erreur DNS.
La solution idéale (pour le cas où l'on serait "obligé" de placer le script inline, est d'utiliser le parametre DEFER qui lance l'exécution du script seulement une fois que l'ensemble de la page est chargée ... au lieu de retarder l'exécution par timeout)

Je viens de penser à cette solution conne mais efficace (au moins sur IE7 en tout cas)
__________________
yjuliet est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h45.


 
 
 
 
Partenaires

Hébergement Web