2012-02-08 22 views
12

Tengo problemas para entender cómo funciona el escape dentro de los valores de los atributos de la etiqueta html que son javascript. .escapando dentro de la etiqueta html Valor del atributo

me llevan a creer que siempre se debe escapar & ' "<> Así que para javascript como valor de atributo Traté:

<a href="javascript:alert(&apos;Hello&apos;);"></a> 

No funciona Sin embargo:.

<a href="javascript:alert(&#39;Hello&#39;);"></a> 

y

<a href="javascript:alert('Hello');"></a> 

funciona en todos los navegadores!

Ahora estoy totalmente confundido. Si todos mis valores de atributo están entre comillas dobles, ¿significa esto que no tengo que escapar de comillas simples? ¿O son apos y ascii 39 personajes técnicamente diferentes? Tal que javascript requiere ascii 39, pero no apos?

+0

OK, descubrí que ' no es en realidad una entidad de referencia en HTML, a pesar de lo que dicen las w3schools (http://www.w3.org/TR/1998/REC-html40-19980424/sgml/entities.html) – Myforwik

+0

Creo que ''' está bien definido desde [HTML 5.0] (https://www.w3.org/TR/html50/syntax.html#named-character-references). –

Respuesta

26

Hay dos tipos de "escapes" implicados aquí, HTML y JavaScript. Al interpretar un documento HTML, los escapes de HTML se analizan primero.

En lo que se considera HTML, las reglas dentro de un valor de atributo son los mismos que en otros lugares además de una regla adicional:

  • El carácter menos-que < debe escaparon. Por lo general, &lt; se usa para esto. Técnicamente, dependiendo de la versión HTML, escaparse no siempre es necesario, pero siempre ha sido una buena práctica.
  • Se debe escapar el ampersand &. Usualmente se usa &amp; para esto. Esto, también, no siempre es obligatorio, pero es más fácil hacerlo siempre que aprender y recordar cuando es necesario.
  • El carácter que se utiliza como delimitadores alrededor del valor del atributo debe ser escapado dentro de él. Si utiliza las comillas de Ascii " como delimitador, se acostumbra a escapar de sus ocurrencias usando &quot; mientras que para el apóstrofo Ascii, la referencia de entidad &apos; se define solo en algunas versiones HTML, por lo que es más seguro usar la referencia numérica &#39; (o &#x27;).

Puede escapar > (o cualquier otro carácter de datos) si lo desea, pero nunca es necesario.

En el lado de JavaScript, hay algunos mecanismos de escape (con \) en literales de cadena. Pero estos son un problema diferente, y no son relevantes en su caso.

En su ejemplo, en un navegador que cumpla con las especificaciones actuales, el intérprete de JavaScript ve exactamente el mismo código alert('Hello');.El navegador ha "guardado" &apos; o &#39; en '. Me sorprendió un poco que &apos; no sea universalmente compatible en estos días, pero no es un problema: rara vez hay necesidad de escapar del apóstrofo Ascii en HTML (solo es necesario escaparse dentro de los valores de los atributos y solo si usa el apóstrofo Ascii como su delimitador), y cuando existe, puede usar la referencia &#39;.

+0

Por curiosidad, ¿podría detallar cuándo es necesario escapar de los símbolos y cuándo no? –

+1

@RakeshPai, eso depende de la versión HTML. Según las reglas de HTML 4.01, se debe escapar al ampersand si es seguido inmediatamente por una letra Ascii (a-z, A-Z) o si está seguido inmediatamente por el signo de número '#' y una letra Ascii. –

+0

Interesante. Tiene sentido ya que entrará en conflicto con otros tipos de entidades HTML. Gracias. –

-2

Tiene razón en que no tiene que escapar de comillas simples si su etiqueta está entre comillas dobles. Cuando codigo javascript en etiquetas (lo cual ya es raro con jQuery) el único carácter que escapo es la comilla doble, los navegadores manejan el resto muy bien.

Cuestiones relacionadas