2012-02-08 19 views
12

Ho difficoltà a capire come funziona l'escaping all'interno dei valori degli attributi del tag html che sono javascript. .escaping all'interno del valore dell'attributo tag html

ero portato a credere che si dovrebbe sempre sfuggire & ' "<> Così, per JavaScript come un valore di attributo ho provato:

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

Non funziona però:.

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

e

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

funziona in tutti i browser!

Ora sono totalmente confuso. Se tutti i miei valori di attributo sono racchiusi tra virgolette, vuol dire che non devo sfuggire alle virgolette singole? O è apos and ascii 39 personaggi tecnicamente diversi? Tale che javascript richiede ASCII 39, ma non apos?

+0

OK, ho appena scoperto che ' non è in realtà un'entità di riferimento in HTML, nonostante ciò che dicono w3schools (http://www.w3.org/TR/1998/REC-html40-19980424/sgml/entities.html) – Myforwik

+0

Penso che ''' sia ben definito da [HTML 5.0] (https://www.w3.org/TR/html50/syntax.html#named-character-references). –

risposta

26

Qui ci sono due tipi di "escape", HTML e JavaScript. Quando si interpreta un documento HTML, gli escape HTML vengono analizzati per primi.

Per quanto considerato HTML, le regole all'interno di un valore di attributo sono le stesse come altrove più una regola aggiuntiva:

  • Il meno-che carattere < deve essere sfuggito. Di solito viene usato per questo lo &lt;. Tecnicamente, a seconda della versione HTML, l'escaping non è sempre richiesto, ma è sempre stata una buona pratica.
  • La e commerciale & deve essere sfuggita. Di solito viene usato per questo lo &amp;. Anche questo non è sempre obbligatorio, ma è più semplice farlo sempre che imparare e ricordare quando è richiesto.
  • Il carattere utilizzato come delimitatore attorno al valore dell'attributo deve essere sfuggito al suo interno. Se si utilizza la virgola Ascii " come delimitatore, è consuetudine evitare le occorrenze utilizzando &quot; mentre per l'apostrofo Ascii, il riferimento di entità &apos; è definito solo in alcune versioni HTML, quindi è più sicuro utilizzare il riferimento numerico &#39; (o &#x27;).

È possibile sfuggire a > (o qualsiasi altro carattere di dati) se lo si desidera, ma non è mai necessario.

Sul lato JavaScript, esistono alcuni meccanismi di escape (con \) in stringhe letterali. Ma questi sono un problema diverso e non rilevanti nel tuo caso.

Nell'esempio, su un browser conforme alle specifiche correnti, l'interprete JavaScript vede esattamente lo stesso codice alert('Hello');.Il browser ha "senza caratteri di escape" &apos; o &#39; a '. In questo momento sono stato sorpreso che lo &apos; non sia universalmente supportato, ma non è un problema: raramente c'è bisogno di sfuggire all'apostrofo dell'Ascii in HTML (l'escape è necessario solo all'interno dei valori degli attributi e solo se si usa l'Ascii come apostrofo come il suo delimitatore) e, quando lo è, è possibile utilizzare il riferimento &#39;.

+0

Per curiosità, potresti per favore approfondire quando è necessario fuggire dalle e commerciali e quando non lo è? –

+1

@RakeshPai, che dipende dalla versione HTML. Secondo le regole HTML 4.01, la e commerciale deve essere preceduta da una lettera Ascii (a-z, A-Z) o immediatamente seguita dal segno numerico '#' e una lettera Ascii. –

+0

Interessante. Ha senso dal momento che entrerà in conflitto con altri tipi di entità HTML. Grazie. –

-2

Sei corretto che non devi sfuggire alle virgolette singole se il tuo tag è racchiuso tra virgolette. Quando faccio codice javascript in tag (che è raro più con jQuery) l'unico personaggio che sfuggo è la doppia citazione, i browser gestiscono il resto bene.