2010-10-22 9 views
10

sto cercando di impostare il valore di attributo che contiene un apice:Sono consentite virgolette singole/doppie all'interno dei valori degli attributi HTML?

var attr_value = "It's not working"; 
var html = "<label my_attr='" + attr_value + "'>Text</label>"; 
$('body').html(html); 

Tuttavia, ottengo il seguente risultato:

<label working="" not="" s="" my_attr="It">Text</label> 

Come potrei risolvere questo problema?

Le virgolette sono consentite all'interno dei valori degli attributi?

risposta

17

Sì, entrambe le citazioni sono ammessi nei valori degli attributi, ma è necessario HTML-sfuggire la citazione che si sta utilizzando come un delimitatore di valore di attributo, così come altri caratteri HTML-speciale come < e &:

function encodeHTML(s) { 
    return s.split('&').join('&amp;').split('<').join('&lt;').split('"').join('&quot;').split("'").join('&#39;'); 
} 

var html= '<label my_attr="'+encodeHTML(attr_value)+'">Text</label>'; 

Tuttavia, si sono di solito molto meglio non cercando di incidere un documento insieme da stringhe di codice HTML. Risolvi i bug e le iniezioni di HTML (che portano a lacune di sicurezza di cross-site-scripting) ogni volta che ti dimentichi di scappare. Invece, utilizzare metodi di stile DOM come attr(), text() e la scorciatoia costruzione:

$('body').append(
    $('<label>', {my_attr: attr_value, text: 'Text'}) 
); 
+0

Grazie mille per una risposta dettagliata! Solo per curiosità sull'implementazione di 'encodeHTML': può essere implementato usando la funzione' replace', giusto? È meno efficace? –

+0

Può, sicuro, 'sostituire (/ &/g, '&') ...'. In questo caso non importa in quanto le stringhe di ricerca non possono contenere alcun carattere speciale-regex, ma in generale per plain stringa-replace 'split' /' join' può essere più semplice, dal momento che è possibile utilizzare le stringhe di ricerca senza dover preoccuparsi di regex-escape. Le prestazioni comparative variano tra i vari browser. – bobince

+0

Grazie! Potresti darmi un puntatore al tutorial "costruzione rapida"? –

2
var attr_value = "It&#39;s not working" 
2

utilizzare le virgolette doppie come delimitatore attributo:

var html = "<label my_attr=\"" + attr_value + "\">Text</label>"; 
8

È possibile utilizzare virgolette singole all'interno di doppi apici o doppi apici all'interno di virgolette singole. Se si desidera utilizzare le virgolette singole tra virgolette singole o virgolette tra virgolette doppie, è necessario codificarle in formato HTML.

markup XHTML:

<label attr="This 'works'!" /> 
<label attr='This "works" too' /> 
<label attr="This does NOT \"work\"" /> 
<label attr="And this is &quot;OK&quot;, too" /> 
+0

quello con il backslash non funziona. Questa è una fuga JavaScript, non HTML. – bobince

+0

Hai ragione, ho modificato la mia risposta e rimosso la fuga. – CodeTwice

+0

Hai appena dimenticato la chiusura '" 'in'