Estupendamente raro IE 9 Javascript bug: Alterar el título del documento hace que el código posterior se ejecute


No entiendo esto en absoluto. Aquí hay un código Javascript que funciona en todos los navegadores, excepto IE 9. Se llama desde una película Flash usando ExternalInterface, y está destinado a cambiar dinámicamente el tamaño de la película en el DOM si el tamaño de la película cambia internamente

function vResizeFlash(swfId, ht) {
    document.getElementById(swfId).height = "100%";
    document.getElementById('flashContainer').style.height = ht + "px";
}

Pero funciona bien si altero el documento.título:

function vResizeFlash(swfId, ht) {
    // IE 9 won't run the rest of this function unless
    // we go through the charade of changing the document title.
    if (navigator.appName.indexOf("Microsoft") != -1) {
       var docTitle = document.title.replace(/^(.+?)\s*$/,"$1");
       document.title = docTitle + " ";
    }
    // Well-coded browsers begin here
    document.getElementById(swfId).height = "100%";
    document.getElementById('flashContainer').style.height = ht + "px";
}

Aquí simplemente recorte cualquier espacio en blanco desde el lado derecho del document.title, luego agregue un solo carácter de espacio en blanco. De repente se ejecutan las siguientes líneas. Nota: hay otras llamadas ExternalInterface en la página, y todas funcionan bien, incluso en IE 9, por lo que no es un problema de Flash/IE 9.

Me topé con la solución porque estaba alterando el título para mostrar los argumentos de la función (como una prueba de depuración rápida), solo para asegurarme de que la función se estaba ejecutando. Y de repente el código funcionó. ¿Sacarlo? No funciona. 100% reproducible.

Cualquiera sabe por qué este comportamiento absolutamente estupefaciente toma lugar?

ACTUALIZACIÓN

@c69 ha planteado la pregunta: "Tal vez su eliminador de código muerto de IE9?"

No sabía nada de esto, así que busqué en Google y encontré este artículo sobre el tema, así como alguna discusión de él en otro lugar. No se lo suficiente como para evaluar cómo esto afectaría a una función Javascript de dos líneas, sin embargo, especialmente porque una de las líneas tiene un referente en la página (aunque se carga tarde a través del Código SWFObject). Aún así, sería un error bastante malo para un "optimizador" de código eliminar líneas de código que considera innecesarias porque no entiende cómo se llaman. Y si no entendió cómo se llaman las líneas, cómo insertar una línea haciendo un cambio falso en el documento.título hacer que el código de repente "necesario"?

ACTUALIZACIÓN 2

Otra pieza del rompecabezas Esto puede tener algo que ver con el modo de compatibilidad de IE 9. Pagina comienza en el modo estándar de IE 9.

introduzca la descripción de la imagen aquí

Ahora, si enciendo el modo de compatibilidad de IE,

introduzca la descripción de la imagen aquí

El problema desaparece sin usar el truco anterior. Apágalo, y el problema vuelve (si no hay hack presente).

Pero cuando intenté hacer una prueba simple usando exactamente el mismo HTML (menos un par de etiquetas JSP) y un SWF reducido que solo contiene el código de cambio de tamaño y las herramientas para probar, todo funciona bien. En ese caso, sin embargo, no el icono de compatibilidad se muestra en absoluto.

introduzca la descripción de la imagen aquí

Estamos usando Tomcat 6.0.32. No soy consciente de que estamos utilizando encabezados especiales, y no hay etiquetas meta con respecto al modo de compatibilidad de IE (ya sea en la aplicación principal o en mi aplicación de prueba).

Author: Robusto, 2011-09-21

2 answers

Al igual que las menciones de InvertedSpear, compruebe su tipo de documento, he tenido problemas con IE9 recientemente y la mayor parte se redujo a las etiquetas de tipo Doc que activan un modo de compatibilidad que no necesitaba, lo mismo puede ser cierto de las etiquetas meta, por lo que podría reducirse a sus etiquetas Meta.

Siempre puede imponer un modo de compatibilidad de trabajo utilizando los enlaces a continuación también.

De: http://evolpin.wordpress.com/2011/02/25/ie9-compatibility-and-the-meta-tag/

He descubierto que esto es de hecho documentado por Microsoft {

Http://msdn.microsoft.com/en-us/library/cc288325 (VS.85).aspx

"El encabezado compatible con X-UA no distingue entre mayúsculas y minúsculas; sin embargo, debe aparecer en el encabezado de la página web (la sección HEAD) antes que todos los demás elementos excepto el elemento title y otros elementos meta."

 2
Author: Charlie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-30 08:36:17

Cada vez que veo que algo como esto sucede en cualquier idioma es porque hay otro código que tiene un error. Como usted señaló su caso simple no produce el problema. Intente eliminar otro código unas pocas líneas a la vez hasta que el problema desaparezca; el último código eliminado debe contener el problema.

Salud

 2
Author: Scott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-30 16:01:46