Problème avec l'analyseur HTML dans IE
-
08-07-2019 - |
Question
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 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, cela supprime l'erreur, mais j'en ai besoin pour vérifier =/... toutes les idées seront appréciées =).
La solution
Vous modifiez le document pendant son chargement (lorsque le navigateur n'a pas & "vu &"; 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é.
blog IE a l'explication à ce sujet.
La solution consiste à modifier un autre élément déjà présent dans le document et qui a été chargé (le navigateur a déjà vu la balise de fermeture correspondante).
BTW: la chaîne </
n'est pas autorisée dans <script>
élément. Utilisez <\/
qui est un équivalent sûr dans les chaînes JS.
Autres conseils
J'ai eu le même problème. Mon problème était que j'appelais une fonction Javascript avant la fermeture du conteneur 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();
});
Lire le doc lié par porneL, j'ai trouvé une solution simple à ce problème :En ajoutant un paramètre « defer » au script, tout fonctionne bien.
<script defer=true>
Comme Sergey Kirienko a dit: utilisez des commentaires conditionnels. Le code ci-dessous ne sera exécuté que par Internet Explorer. Microsoft dispose de bonnes informations sur la 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 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]-->
La détection par navigateur est un problème à éviter autant que possible. Il est préférable de rechercher la fonctionnalité 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 détecter 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
}
Les commentaires conditionnels constituent le meilleur moyen de s’adresser à IE. Vous n'avez même pas besoin d'utiliser JavaScript. Voir, par exemple, http://www.positioniseverything.net/articles/ie7-dehacker.html .
Peut-être un peu tard, mais cette erreur s’affiche é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 & et coller].
Résolu en renommant les div avec des identifiants uniques.
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 cela. Très facile, essayez-le!
Une version actuelle de https://apis.google.com/js/plusone.js a provoqué ce bogue sur IE8 dans l’un de mes sites.
La solution la plus simple - supprimez Google +.
Solution simple - envelopper 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);
});