javascript - ¿Debo usar "]]>" o "//]]>" para cerrar una sección CDATA en xHTML
css (4)
Según www.w3.org/TR/xhtml1/#h-4.8, la sección CDATA se puede definir como: [no //]
Sí. En XHTML, ellos pueden. XHTML adecuado, tal como lo lee un analizador XML, como cuando se sirve application/xhtml+xml
en un navegador web que no es IE.
Pero probablemente en realidad estés sirviendo como text/html
, lo que significa que tu navegador no es un ''procesador XML'' como se menciona en esa sección. Es un analizador legado de HTML4, por lo que debe cumplir con las pautas del apéndice C y evitar cualquier característica XML que no funcione en HTML4.
En particular, las cadenas <![CDATA[
y ]]>
en un bloque <script>
o <style>
no son especiales para un analizador HTML4, porque en HTML4 esos dos elementos son ''elementos CDATA'' donde el marcado no se aplica ( excepto por la secuencia </
ETAGO para finalizar el elemento en sí). Por lo tanto, un analizador HTML4 enviará esas cadenas directamente al motor CSS o JavaScript.
Debido a que <![CDATA[
no es JS válido, obtendrá un error de sintaxis de JavaScript. (Las otras respuestas están equivocadas aquí: no son solo los navegadores muy antiguos , sino todos los navegadores HTML4, que darán errores para una sección de CDATA sin comentarios en el script).
Utiliza la //
comentario //
o /*
para ocultar el contenido del motor de JavaScript o CSS. Asi que:
<script type="text/javascript">//<![CDATA[
alert(''a&b'');
//]]></script>
(Tenga en cuenta el //
principal; esto se omitió en el código de ejemplo de W3Schools y hace que el código de ejemplo no funcione en absoluto. Fallo. No confíe en W3Schools: no tienen nada que ver con W3C y su material suele ser basura)
Esto es leído por un analizador de HTML como:
-
script
etiqueta abierta que establece contenido CDATA hasta el próximo ETAGO - Texto
//<![CDATA[/n alert(''a&b'');/n//]]>
- ETAGO y
script
etiqueta cerrada - -> contenido resultante enviado al motor de JavaScript:
//<![CDATA[/nalert(''a&b'');/n//]]>
Pero por un analizador XML como:
-
script
etiqueta abierta (sin implicaciones especiales de análisis) - Contenido de texto
//
- Abra la sección CDATA que establece el contenido CDATA hasta la siguiente secuencia
]]>
-
/n alert(''a&b'');/n//
texto/n alert(''a&b'');/n//
- Cerrar la sección CDATA
-
script
cierre de etiqueta - -> contenido resultante enviado al motor de JavaScript:
///nalert(''a&b'');/n//
Si bien el proceso de análisis es bastante diferente, el motor JS termina con el mismo código efectivo en cada caso, ya que gracias a la //
s la única diferencia está en los comentarios.
Tenga en cuenta que este es un caso muy diferente al de la vieja escuela:
<script type="text/javascript"><!--
alert(''a&b'');
//--></script>
que era ocultar el contenido de estilo de escritura / estilo para que no se escribiera en la página en los navegadores que no entendían las etiquetas <script>
y <style>
. Esto no generará un error de JavaScript / CSS, porque un hack se colocó en un nivel diferente: es una característica sintáctica de los lenguajes CSS y JavaScript que <!--
está definido para no hacer nada, permitiendo que este hack funcione.
Esos navegadores son historia antigua; Absolutamente no deberías usar esta técnica hoy. Especialmente en XHTML, como un analizador XML lo llevaría a su palabra, convirtiendo todo el bloque de scripts en un comentario XML en lugar de un código ejecutable.
Quiero incluir scripts o CSS en línea en xHTML sin escapar de caracteres especiales.
Evita hacer esto y serás mucho más feliz.
¿ Realmente necesitas los <
y &
caracteres en un <style>
? No, casi nunca. ¿Realmente los necesitas en <script>
? Bueno ... a veces, sí, y en ese caso, la sección de CDATA comentada es aceptable.
Pero para ser honesto, la directriz de compatibilidad con XHTML C.4 es tan aplicable a HTML4 como a XHTML1: todo lo que no sea trivial debe ser un script externo, y entonces no tiene que preocuparse por nada de esto.
Quiero integrar scripts o CSS en XHTML sin escapar de caracteres especiales.
Puedo hacerlo usando una sección marcada CDATA.
Según http://www.w3.org/TR/xhtml1/#h-4.8 la sección CDATA se puede definir como:
<script type="text/javascript">
<![CDATA[
... unescaped script content ...
]]>
</script>
Luego, según http://www.w3schools.com/TAGS/tag_script.asp , el CDATA puede verse como:
<script type="text/javascript"><![CDATA[
// some code
//]]></script>
¿Qué método para cerrar la sección CDATA es mejor? ]]>
o //]]>
?
Depende del navegador. A pesar de lo que algunas personas piensan, w3schools no está relacionado con el W3C, por lo que su consejo es tomarlo con un grano de sal.
Los navegadores modernos deberían poder reconocer las secciones CDATA. MSIE OTOH no lo hace, pero está bien, porque no es compatible con XHTML (no está enviando contenido XHTML como texto / html para compatibilidad con MSIE, ¿verdad? No tendría mucho sentido utilizar XHTML en primer lugar).
El problema es que los navegadores que no entienden completamente XHTML tratarán las directivas CDATA como texto regular.
tl; dr: la solución completa compatible con versiones anteriores sería algo así como:
<script type="text/javascript"><!--//<![CDATA[
code goes here...
//]]>--></script>
Eso es simplemente repulsivo. Si quiere mantener la compatibilidad con versiones anteriores, pegue su JS en los archivos JS o manténgase en HTML hasta que pueda permitirse ignorar el MSIE 8 (que, según la cantidad de años que tomó la gente para rechazar el MSIE 6, podría ser alrededor del año 2020).
El comentario HTML ( <!-- -->
) solo es necesario para los navegadores que no entienden las etiquetas de script. Las barras diagonales dobles son necesarias para los navegadores que no entienden las secciones CDATA (es decir, los navegadores que no son XHTML como MSIE). La sección CDATA es necesaria para que XHTML evite XML malformado (por ejemplo, las comparaciones mayores y menores que, por ejemplo, romperían el XML de otra manera o necesitarían escapar, lo que nuevamente es un problema del navegador).
Para obtener más información sobre el problema con el envío de XHTML como texto / html, lea: http://hixie.ch/advocacy/xhtml
EDITAR: Para corregirme, la sintaxis completa para el soporte hacia atrás en realidad sería la siguiente según Hixie:
<script type="text/javascript"><!--//--><![CDATA[//><!--
...
//--><!]]></script>
Gracias, Alohci.
Puede poner comentarios antes de las etiquetas CDATA si le preocupa que alguien esté usando un navegador muy antiguo que no sabe nada sobre XHTML. Pero luego debe poner un comentario antes de la etiqueta de inicio para evitar que cause un error de sintaxis:
<script type="text/javascript">
//<![CDATA[
// some code
//]]>
</script>
Simplemente lo haría sin el //. Esos son un retroceso a los días en que ciertos navegadores (que permanecerán sin nombre) tuvieron que ser "engañados" para aceptar corchetes de cierre en etiquetas de script.