2008-11-19 11 views
34

Estoy intentando crear un cuadro de diálogo que aparecerá sólo si el navegador seleccionado es IE (cualquier versión) sin embargo me sale este error:Problema con HTML Analizador en IE

Message: HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)

Eso es todo en la "Línea/Char/Code "0 así que no sé dónde está el error. El código que estoy usando es la siguiente:

<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> 

me he dado cuenta si quito el "BrowserDetect.browser" y .version que elimina el error, pero necesito esas comprobar =/... alguna idea se apreciará =).

Respuesta

27

Usted está modificando documento mientras se está cargando (cuando el navegador no ha "visto" etiqueta de cierre para este elemento). Esto causa una situación muy difícil en el analizador y en IE no está permitido.

IE blog tiene una explicación de esto.

La solución es modificar otro elemento que esté más arriba en el documento y que se haya cargado por completo (donde el navegador ya vio la etiqueta de cierre).


Por cierto: La cadena </ no está permitido en <script> elemento. Use <\/ que es un equivalente seguro en cadenas JS.

3

Me gusta Sergey Kirienko dijo: use los comentarios condicionales. El código a continuación solo será ejecutado por Internet Explorer. Microsoft tiene buena información en la página this.

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

Si desea una versión específica se puede probar para eso también:

<!--[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

browser sniffing es una chapuza que debe evitarse siempre que sea posible. Lo mejor es oler la capacidad que desea usar. Supongamos que quiere ejecutar una expresión XPath utilizando document.evaluate(), pero no sabe si es compatible. En lugar de la inhalación para los navegadores compatibles, hacer esto:

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

Tuve este mismo problema. Mi problema era que estaba llamando a una función de Javascript antes de que se cerrara el div.

Para solucionar el problema, llamo a la función Javascript dentro del jQuery manejador ready evento:

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

Nota para los futuros lectores: Usted no necesita realmente jQuery para hacer esto - hacer una búsqueda de la 'load' o manejadores de eventos 'DOMReady' –

+1

Si vas a usar jQuery, puedes usar el atajo de sintaxis nice para document.ready: $ (function() {return false;}); –

0

Tal vez un poco tarde, pero este error, también aparecerá si está utilizando SWFObject y tienen 2 divs con la mismo ID.

Tenía divs duplicados, [con id = "contenido flash", gracias a la copia & pegar].

Se solucionó cambiando el nombre de los divs por identificadores únicos.

7

Al leer el doc vinculado por porneL, encontré una solución simple para este problema: Agregar un parámetro 'diferir' a la secuencia de comandos, todo funciona bien.

<script defer=true> 
0

Una versión actual de https://apis.google.com/js/plusone.js provocó este error en IE8 en uno de mis sitios.

La solución más fácil: eliminar google +.

solución fácil - envolver el código en jQuery -función document.ready o similar:

$(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); 
});