2010-10-22 8 views
10

Ich versuche Attributwert zu setzen, die einen Apostroph enthält:Sind einzelne/doppelte Anführungszeichen in HTML-Attributwerten zulässig?

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

Allerdings bekomme ich folgendes Ergebnis:

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

Wie könnte ich dieses Problem beheben?

Sind in Attributwerten doppelte Anführungszeichen zulässig?

Antwort

17

Ja, beide zitiert in Attributwerten erlaubt, aber Sie müssen das Zitat Sie verwenden als Attributwert-Begrenzer, sowie andere HTML-Sonderzeichen HTML-entkommen wie < und &:

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>'; 

Sie sind jedoch in der Regel viel besser dran nicht versuchen, ein Dokument zu hacken zusammen aus HTML-Strings. Sie riskieren Bugs und HTML-Injection (was zu Cross-Site-Scripting-Sicherheitslücken führt) jedes Mal, wenn Sie die Flucht vergessen. Verwenden Sie stattdessen DOM-Stil Methoden wie attr(), text() und den Bau Abkürzung

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

Vielen Dank für eine detaillierte Antwort! Nur aus Neugier auf die Implementierung von 'encodeHTML': Es kann mit der' replace' Funktion implementiert werden, oder? Ist es weniger effektiv? –

+0

Es kann, sicher, ersetzen (/ &/g, '&') ... '. In diesem Fall spielt es keine Rolle, da die Suchzeichenfolgen keine regulären Sonderzeichen enthalten dürfen, aber im Allgemeinen kann für plain string-replace 'split' /' join' einfacher sein, da Sie Suchstrings verwenden können, ohne müssen Sorgen Sie sich für Regex-Escaping. Die vergleichende Leistung variiert zwischen Browsern. – bobince

+0

Danke! Könnten Sie mir einen Zeiger auf das Tutorial "Konstruktionsverknüpfung" geben? –

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

Verwenden doppelte Anführungszeichen als Attribut Trennzeichen:

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

Sie einfache Anführungszeichen innerhalb von doppelten oder doppelte Anführungszeichen in einfache Anführungszeichen verwenden können. Wenn Sie einfache Anführungszeichen in einfache Anführungszeichen oder doppelte Anführungszeichen in Anführungszeichen setzen möchten, müssen Sie sie im HTML-Format codieren.

Valid Markup:

<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

Das mit den Schrägstriche nicht funktioniert. Das ist ein JavaScript-Escape, kein HTML. – bobince

+0

Sie haben Recht, ich habe meine Antwort bearbeitet und die Flucht entfernt. – CodeTwice

+0

Sie haben gerade das schließende '" 'in'