Dolores de cabeza y la chepa angustiada hemos tenido cierto tiempo durante los últimos días.
Ocurre que hay un bug en IE7 en la implementación de la función getElementsByTagName() de su motor javascript. El error ese descrito en muchos foros de internez consiste en que si pides todos los nodos, pasando como parámetro “*”, la función devolverá el conjunto vacío.
Pues hay más. Tengo testigos de que lo que voy a relatar es cierto, que nos hemos roto la cabeza con ello y que dimos con la solución probando cosas tontas a la desesperada.
En muchas páginas de una aplicación que tenemos medio entregada utilizamos una función que nos sirve para que el navegador interprete los bloques script que se incluya dinámicamente mediante AJAX. En esta función utilizamos esa famosa función getElementsByTagName() con buenos resultados en todos los navegadores hasta ahora.
En una nueva aplicación cuyo desarrollo se ha puesto en marcha recientemente y sólo en una de las páginas incluidas nos ocurría que la llamada a getElementsByTagName (“script”) devolvía siempre una lista vacía. Probamos a poner el parámetro en mayúsculas y nada…
Probamos a recorrer el árbol a mano desde firstChild while(nextSibling)… El nodo script no aparecía en el dom. Metimos el nodo dentro de un span y dentro de un div y no aparecía en todo el árbol.
Hubo un momento de luz en el que el nodo apareció, quitamos el recorrido hecho a piñón y la llamada a la función esa de marras pasó a funcionar. Lo dejamos ir como si no hubiéramos visto nada.
Al rato ¡Zas!, otra vez. ¿Qué habíamos hecho? ¿Qué habíamos cambiado antes para que funcionase? ¿Qué hicimos ahora para que dejase de funcionar?
Pues una tontería tan gorda como esta:
Jsp incluida por ajax, primera versión que no funcionaba:
<%--cabeceras--%>
<%--bloque script--%>
<%--un div con cosas--%>
Jsp incluida, segunda versión que funcionaba:
<%--cabeceras--%>
<%--un div con cosas--%>
<%--bloque script--%>
Después la página se manipuló para quitar cosas sobrantes y dejar el script que iba a generar el contenido final para el “div con cosas”:
<%--cabeceras--%>
<%--un div sin cosas--%>
<%--bloque script que genera las cosas para el div sin cosas--%>
Esa página no funcionaba. La “lógica” nos decía que lo que habíamos hecho es quitar contenidos a la página así que añadimos un texto (un literal) escrito antes del div de forma que la página se quedó en:
<%--cabeceras--%>
<%--un div sin cosas--%>
test
<%--bloque script que genera las cosas para el div sin cosas--%>
Y, carajo, funcionó. Risas… Fiesta… Pedro, Pedro, ven acá que necesito un testigo pa esto…
Versión final de la página, para que el texto no estorbe:
<%--cabeceras--%>
<%--un div sin cosas--%>
<%--bloque script que genera las cosas para el div sin cosas--%>
Hasta conseguir...