2010-10-22 10 views
10

Próbuję ustawić wartość atrybutu, który zawiera jeden cytat:Czy dozwolone są pojedyncze/podwójne cudzysłowy w wartościach atrybutów HTML?

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

Jednak uzyskać następujący wynik:

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

Jak mogę rozwiązać ten problem?

Czy dopuszczalne są cudzysłowy wewnątrz wartości atrybutów?

Odpowiedz

17

Tak, oba cytaty są dozwolone w wartościach atrybutów, ale trzeba HTML uciec cytat używasz jako separatora wartości atrybutów, a także inne znaki HTML-special jak < i &:

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

jednak są zwykle znacznie lepiej nie próbuje włamać dokument wraz z ciągów znaków HTML. Ryzykujesz błędy i wstrzykiwanie HTML (prowadząc do dziur w zabezpieczeniach cross-site-scripting) za każdym razem, gdy zapomnisz uciec. Zamiast tego należy użyć metody DOM-style Podoba attr(), text() i skrót budowy:

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

Wielkie dzięki za szczegółową odpowiedź! Tylko dla ciekawości odnośnie implementacji 'encodeHTML': Może być zaimplementowana za pomocą funkcji' replace', prawda? Czy to mniej skuteczne? –

+0

Może, na pewno, "wymienić (/ & g," & ") ...". W tym przypadku nie ma znaczenia, ponieważ ciągi wyszukiwania nie mogą zawierać żadnych znaków specjalnych regex, ale ogólnie dla zwykłego ciągu znaków - zamień 'split' /' join' może być prostszy, ponieważ możesz używać ciągów wyszukiwania bez konieczności martw się o regex-escaping. Wydajność porównawcza jest różna w różnych przeglądarkach. – bobince

+0

Dzięki! Czy możesz dać mi wskazówkę do samouczka "budowa skrótu"? –

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

Stosować podwójne cudzysłowy jako ogranicznik atrybut:

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

Można używać apostrofów wewnątrz cudzysłów lub cudzysłów wewnątrz pojedynczych cudzysłowów. Jeśli chcesz używać pojedynczych cudzysłowów w cudzysłowach lub podwójnych cudzysłowach w cudzysłowach, musisz je kodować HTML.

prawidłowych znaczników:

<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

Jeden z ukośniki nie działa. To jest ucieczka JavaScriptu, a nie HTML. – bobince

+0

Masz rację, zredagowałem moją odpowiedź i usunąłem ucieczkę. – CodeTwice

+0

Po prostu zapomniałeś o zamknięciu '' '' in'

Powiązane problemy