web-dev-qa-db-fra.com

Problème avec HTML Parser dans IE

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

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

Tout est dans "Ligne/Caractère/Code" 0, donc je ne sais pas où se trouve 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, cela supprime l'erreur, mais j'ai besoin de ceux-ci pour vérifier =/... toutes les idées seront appréciées =).

35
Tsundoku

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

IE blog a l'explication de cela.

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


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

27
Kornel

J'ai eu le même problème. Mon problème était que j'appelais une fonction Javascript avant la fermeture de la variable div

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

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

En lisant le doc lié par porneL, j’ai trouvé une solution de contournement simple pour résoudre ce problème: l’ajout d’un paramètre 'différer' dans le script fonctionne parfaitement.

<script defer=true>
7
Pablo Alba

La détection de navigateur est un problème qui devrait être évité autant que possible. Il est préférable de rechercher la capacité que vous souhaitez utiliser. Supposons que vous souhaitiez exécuter une expression XPath à l'aide de document.evaluate (), mais que vous ne sachiez pas si elle est prise en charge. Au lieu de rechercher les navigateurs pris en charge, procédez comme suit:

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

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

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

Si vous voulez une version spécifique, vous pouvez aussi le 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]-->
3
some

Le meilleur moyen de s’adresser à IE uniquement est le commentaire conditionnel. Vous n'avez même pas besoin d'utiliser JavaScript. Voir par exemple http://www.positioniseverything.net/articles/ie7-dehacker.html .

2
Sergey Kirienko

javascript fonctionne très facilement avec navigator.appName. (voir http://de.selfhtml.org/javascript/objekte/navigator.htm ) Vous pouvez créer une requête if avec cette requête. Très facile, essayez-le!

0
David

Une version actuelle de https://apis.google.com/js/plusone.js a provoqué ce bogue sur IE8 sur l'un de mes sites. 

La solution la plus simple - supprimez google +. 

Solution simple - intégrez le code dans la fonction document.ready de jquery ou similaire:

$(document).ready(function(){
     var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
     po.src = 'https://apis.google.com/js/plusone.js';
     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
});
0
Apeli

Peut-être un peu tard, mais cette erreur apparaît également si vous utilisez SWFObject et que vous avez 2 divs avec le même identifiant.

J'ai eu des divs en double, [avec id = "flashcontent", merci de copier/coller].

Résolu en renommant les div avec des identifiants uniques.

0
robasta