35 votes

Problème d'analyseur HTML dans IE

J'essaie de créer une boîte de dialogue qui n'apparaîtra que si le navigateur sélectionné est IE (n'importe quelle version), mais j'obtiens cette erreur :

Message : Erreur d'analyse HTML : Impossible de modifier l'élément conteneur parent avant la fermeture de l'élément enfant (KB927917)

Tout cela est dans "Line/Char/Code" 0 donc je ne sais pas où est l'erreur. Le code que j'utilise est le suivant :

 <script type="text/javascript"> 
  <!--  
  if(BrowserDetect.browser.contains("Explorer"))
  {     
    var Nachricht = 'Hemos detectado que está utilizando ' + BrowserDetect.browser + ' ' +
  BrowserDetect.version + '. Puede que algunas funciones no estén habilitadas. <p></p> Si desea experimentar todo el potencial del portal, por favor intente desde otro navegador (browser). <p></p>Gracias
 showDialog('¡Aviso Importante!',Nachricht,'warning',10);
 } 
 </script>

J'ai remarqué que si je supprime "BrowserDetect.browser" et .version, l'erreur disparaît, mais j'en ai besoin pour vérifier =/... toute idée sera appréciée =).

27voto

porneL Points 42805

Vous modifiez le document alors qu'il est en cours de chargement (lorsque le navigateur n'a pas "vu" la balise de fermeture de cet élément). Cela provoque une situation très délicate dans l'analyseur syntaxique et n'est pas autorisé dans IE.

IE blog a une explication à ce sujet.

La solution consiste à modifier un autre élément qui se trouve plus haut dans le document et qui a été chargé complètement (le navigateur a déjà vu la balise de fermeture pour cet élément).

BTW : La chaîne </ n'est pas autorisé dans <script> élément. Utilisez <\/ qui est un équivalent sûr dans les chaînes JS.

9voto

J'ai eu le même problème. Le problème était que j'appelais une fonction Javascript avant le contenu de la page. div a été fermé.

Pour résoudre le problème, j'appelle la fonction Javascript dans le fichier jQuery ready gestionnaire d'événements :

$(document).ready(function(){
    some_random_javascript_function();
});

7voto

Pablo Alba Points 103

Lire le doc lié par porneL, j'ai trouvé une solution simple pour ce problème : en ajoutant un paramètre 'defer' au script, tout fonctionne bien.

<script defer=true>

3voto

some Points 18965

Comme l'a dit Sergey Kirienko : utilisez les commentaires conditionnels. Le code ci-dessous ne sera exécuté que par Internet Explorer. Microsoft a de bonnes informations sur ce page.

<!--[if IE]>
<script type="text/javascript"> 
 showDialog('¡Aviso Importante!','message','warning',10);
 </script>
<![endif]-->

Si vous souhaitez une version spécifique, vous pouvez également la tester :

<!--[if lte IE 7]>
    <script type="text/javascript"> 
     showDialog('¡Aviso Importante!','Your are using a too old version of Internet explorer. Please upgrade','warning',10);
    </script>
<![endif]-->

3voto

Robert J. Walker Points 3712

Le reniflage du navigateur est une astuce qui doit être évitée dans la mesure du possible. Il est préférable de renifler le capacité que vous voulez utiliser. Supposons que vous vouliez exécuter une expression XPath en utilisant document.evaluate(), mais que vous ne sachiez pas si cette méthode est prise en charge. Au lieu de renifler les navigateurs pris en charge, faites ceci :

if (document.evaluate) {
    // go ahead and use it
} else {
    // browser doesn't support it; do something else
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X