No funciona un código JavaScript en la web
¿Es necesario poner los comentarios en un tag <script>?
Programando diariamente, en cada nueva jornada te puedes encontrar con casos particulares y extraños como el que hoy toca. Es curioso, muy curioso, pero un código JavaScript que he utilizado muchas veces, no funcionaba en una web, sin embargo, todos los demás códigos -en JavaScript y en dicha web- funcionaban correctamente. Para que te hagas una simple idea, en un documento HTML4, en el elemento <body> de dicha web, puse el siguiente código:
<script type="text/javascript">
<!--
document.write( "This code doesn't work! karmany, Why?");
//-->
</script>
Y ese código no mostraba en pantalla nada de nada, se quedaba vacío. Le di muchísimas vueltas a la cabeza porque no tiene sentido, ¿por qué no funciona? Seguramente si tú tienes este problema, te hagas estas primeras preguntas:
- ¿Tienes activado JavaScript en tu navegador? -Sí, sí que está activado.
- ¿Sólo es ese código el que da problemas o no funciona ningún código JavaScript? -Solo está el problema en ese código.
Después de volver a investigar (y por supuesto de perder tiempo), desenmascaré al supuesto culpable y para que no te pase a ti y tengas que perder un valioso tiempo, te muestro la explicación y al final la solución. Es curios@.
Buscando explicación W3C
No tiene razón de ser porque además lo he utilizado en otras webs, ¿por qué solo falla en esta? Tras unas cuantas pruebas, una de las veces decidí eliminar los comentarios del script y lo dejé así:
<script type="text/javascript">
document.write( "This code doesn't work! karmany, Why?");
</script>
Y al probar veo que sí funciona. Umm, entonces, ¿el inconveniente está en los comentarios dentro de JavaScript? Me puse a leer un par de libros que tengo sobre HTML y JavaScript a ver qué dicen sobre los comentarios y en principio está bien hecho. Estos comentarios están hechos para navegadores antiguos no compatibles con el tag <script>.
Los comentarios HTML según la W3C son así:
<!-- esto es un comentario,
que ocupa dos líneas -->
Y, ¿por qué se pone esas dos barras // al final del código quedando //-->? (observa el código del principio)
La explicación: para que JavaScript no ejecute el tag -->, se ponen las dos barras // que son un comentario en javascript. Por lo tanto, el código está bien y vuelvo al principio de todo: ¿por qué narices falla?
Llamando a Sherlock Holmes
Pensé que podría ser algún espacio y reescribí de nuevo letra por letra el código en una sola línea: tampoco funcionó. ¿Pero si este simple código funciona de maravilla en millones de web? Comparé un archivo .html de una web que funcionaba con el mío para ver los bytes, y los bytes ¡eran exactamente los mismos! Como ves, lo que puede parecer una tontería que has hecho millones de veces, llega a resultar incomprensible y misterioso.
Después de mucho investigar, y como he dicho antes, de ver que los comentarios en un elemento <script> se realizaban para compatibilidad con navegadores antiguos (me estoy refiriendo, por ejemplo, a navegadores como Netscape 1.0, ¡uff! me estoy yendo hacia 1995 o cerca...) que no entendían el tag <script>, esos comentarios en navegadores actuales pueden hacer el efecto contrario que deseamos y todo el código entre <script> y </script> puede llegar a ser considerado un comentario también.
Algunos autores consideran que poner comentarios dentro de <script></script> es una mala práctica, ya que los navegadores actuales entienden todos el tag <script>. Sin embargo, la W3C todavía menciona explícitamente los comentarios en el elemento <script> para HTML4, mientras que para HTML5, la W3C habla sobre restricciones del elemento <script> y menciona "escapar" algunos caracteres, por ejemplo, al usarlos dentro de un script como variables de cadena pero no veo que haga hincapié en esconder los comentarios de los "user agent".
Así que el código del inicio, en HTML5, podríamos dejarlo así:
<script>
document.write( "This code works fine!");
</script>
Este código ya funcionó correctamente en la web y a partir de ahora me hace replantearme el uso de comentarios HTML en un script.