2010-02-22 22 views
9

Así que recientemente descubrí que podía usar las etiquetas <>...</> en javascript en Firefox, que es útil al definir bloques de HTML o CSS.Javascript y `<> ...</>` etiquetas

GM_addStyle(<><![CDATA[ 
    .page { display: block } 
    /* ... */ 
    td { vertical-align: top } 
]]></>); 
//... 
div.innerHTML = <><![CDATA[ 
    <table class="section"> 
    <!-- ... --> 
    </table> 
]]></>; 

Pero no estoy exactamente seguro de lo que está pasando, y me gusta entender la sintaxis que estoy usando. ¿Qué devuelve exactamente <>...</>? Noté que el escape funciona mejor cuando encierro los contenidos en <![CDATA[...]]>, entonces, ¿qué está pasando allí? ¿Es solo Firefox o navegador cruzado?

Traté de buscar esto en línea, pero me encontré con el problema normal de Google/símbolo. Además, la mayoría de los resultados para google CDATA javascript no parecían relevantes.

+1

+1, Buena pregunta. No te apetezca tus posibilidades de compatibilidad entre navegadores aquí :-) Bueno para una extensión de Firefox. –

+0

@Andy E: parece que está en el estándar javascript 1.6, por lo que debería funcionar en cualquier cosa que lo soporte. – rampion

+0

Se llama, ECMAScript para XML. También me sorprende ver esto, aunque lo he leído muchas veces. Aquí hay información de la wikipedia en este (http://en.wikipedia.org/wiki/ECMAScript_for_XML) –

Respuesta

4

Creo que las etiquetas vacías son solo una forma de escribir un elemento raíz para que tenga algo en que envolver un blob de XML. Está diciendo "Interpreta a los hijos de este elemento raíz como XML" y el hijo único en tu caso dice "Interpreta a este hijo como un bloque CDATA".

+0

Entonces, ¿puedo escribir XML aleatorio como un valor en Javascript? Eso parece extraño. – rampion

+0

Me sorprendió, también, cuando lo vi por primera vez. Pero así es como funciona en Flex/Actionscript, y no creo que sea del todo casual. Advertencia: dije "creo" porque no puedo afirmarlo definitivamente. – Robusto

+1

Parece que tiene razón: ["E4X introduce un objeto XML nativo en el lenguaje JavaScript y agrega sintaxis para incrustar documentos XML literales en código JavaScript."] (Https://developer.mozilla.org/En/E4X/ Processing_XML_with_E4X) – rampion

1

No hay ninguna razón para utilizar un literal XMLList (<>...</>) con un único elemento secundario, ya que se maneja como un solo elemento XML de todos modos. ¿Por qué no usar solo <![CDATA[...]]>? Además, <![CDATA[...]]> simplemente devuelve un nodo de texto XML (<![CDATA[]]>.nodeKind() === "text").

Todo esto forma parte de E4X, implementado por ActionScript 3 y ambos motores de JavaScript.

+1

Hmmm ... simplemente '' era un error de sintaxis en FF3.6 (simplemente conectándolo a la Consola de error). No estoy seguro de cómo se evaluaría en un script de Greasemonkey, pero los documentos de mozilla (https://developer.mozilla.org/En/E4X/Processing_XML_with_E4X) dicen que necesitas establecer un atributo especial para evitar de ser tratado especialmente en una etiqueta normal. – rampion

+1

Esto se debe a que está evaluando JavaScript 1.5, no 1.6 en la consola de error. Los problemas de CDATA no ocurrirán en un script de greasemonkey ya que no es un script HTML en línea. Agregue '; e4x = 1' al final del' tipo' del script. O mejor aún, use este shell que le permite usar E4X: http://code.eligrey.com/shell/shell.html –

1

Como dijo Elijah, es la sintaxis de E4X que no funcionará en ningún otro lugar que no sea Mozilla. Parece que no lo está utilizando para nada relacionado con XML, solo confiando en que el método implícito toString del objeto XML es el mismo que el marcado original. ECMA-357 (la especificación E4X) no especifica las reglas exactas de análisis y serialización para XML, por lo que no garantiza, por ejemplo. para eliminar los marcadores <![CDATA[ por usted. IMO confiar en esto incluso solo en Firefox es cuestionable.

En cualquier caso, en realidad no resuelve los problemas de escape de contenido para su uso dentro de un bloque script ... en particular, la secuencia </ sigue siendo válida en HTML 4, todo el lote es válido en XHTML, y que le Todavía tiene que preocuparse por las secuencias </script y ]]> en el contenido. Así que realmente no has ganado mucho ... en el mejor de los casos, tienes una cadena multilínea en scripts externos, a expensas del soporte para todos los otros navegadores. No creo que realmente valga la pena.