экранирование внутри значения атрибута HTML-тега - PullRequest
17 голосов
/ 08 февраля 2012

У меня возникают проблемы с пониманием того, как экранирование работает внутри значений атрибутов тега html, которые являются javascript.

Я был убежден, что вы всегда должны избегать & '"<>. Так что для javascript в качестве значения атрибута Iпробовал:

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

Не работает. Однако:

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

и

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

работает во всех браузерах!

Теперь я полностью сбит с толку. Если все мои значения атрибутов заключены в двойные кавычки, означает ли это, что мне не нужно экранировать одинарные кавычки? Или это apos и ascii 39 технически разные символы? Так, что для javascript требуется ascii 39, а не apos?

Ответы [ 3 ]

31 голосов
/ 08 февраля 2012

Существует два типа «побегов»: HTML и JavaScript.При интерпретации HTML-документа экранированные коды HTML сначала анализируются.

Что касается HTML, то правила в значении атрибута такие же, как и в других местах, плюс одно дополнительное правило:

  • Символ менее 100 * * должен быть экранированОбычно &lt; используется для этого.Технически, в зависимости от версии HTML, экранирование не всегда требуется, но это всегда было хорошей практикой.
  • Амперсанд & должен быть экранирован.Обычно для этого используется &amp;.Это тоже не всегда обязательно, но проще делать это всегда, чем учиться и запоминать, когда это необходимо.
  • Символ, который используется в качестве разделителей вокруг значения атрибута, должен быть экранирован внутри него.Если вы используете кавычку Ascii " в качестве разделителя, то обычно избегаете его вхождений, используя &quot;, тогда как для апострофа Ascii ссылка на сущность &apos; определена только в некоторых версиях HTML, поэтому ее безопаснее всего использоватьчисловая ссылка &#39; (или &#x27;).

Вы можете экранировать > (или любой другой символ данных), если хотите, но это никогда не требуется.

На стороне JavaScript в строковых литералах есть несколько escape-механизмов (с \).Но это другая проблема, которая не относится к вашему случаю.

В вашем примере в браузере, соответствующем текущим спецификациям, интерпретатор JavaScript видит точно такой же код alert('Hello');.Браузер имеет «unescaped» &apos; или &#39; до '.Я был несколько удивлен, что &apos; не поддерживается повсеместно в наши дни, но это не проблема: редко возникает необходимость избежать апострофа Ascii в HTML (экранирование необходимо только в значениях атрибутов и только если вы используете Asciiапостроф как его разделитель), и когда он есть, вы можете использовать &#39; ссылку.

1 голос
/ 08 февраля 2012

&apos; не является допустимым ссылочным объектом HTML . Вы должны бежать, используя &#39;

0 голосов
/ 08 февраля 2012

Вы правы, что вам не нужно избегать одинарных кавычек, если ваш тег заключен в двойные кавычки.Когда я делаю код javascript в тегах (что редко встречается в jQuery), единственным символом, который я избегаю, является двойная кавычка, остальные браузеры прекрасно справляются с остальными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...