HTML-объекты внутри тега script не конвертированы?

<script type="text/javascript">
    function test()    {
        alert('&lt;span&gt;blah&lt;span&gt;');
    }
</script>
<a href="#" onclick="test();">First</a><br />
<a href="#" onclick="alert('&lt;span&gt;blah&lt;span&gt;');">Second</a><br />
Third: &lt;span&gt;blah&lt;span&gt;

Демо: http://jsfiddle.net/LPYTZ/

Почему первый результат отличается? Теги <script> каким-то образом исключены из преобразования сущности?

Ответы

Ответ 1

В HTML, script и элементы стиля определенные в DTD как содержащие CDATA. Это означает, что сущности и теги игнорируются до тех пор, пока синтаксический анализатор не достигнет того, что выглядит как конечный тег.

XHTML отличается, а сущности и теги внутри этих элементов функционируют как обычные, но только при анализе XHTML. Вы можете явно помечать контент как CDATA с помощью <![CDATA[ … ]]>.

Браузеры будут обрабатывать XHTML, который будет использоваться как text/html, используя HTML-правила, которые приводят к большому шару скверны, когда вы пытаетесь написать код, который является правильным в соответствии с обоими наборами правил.

Самый простой способ избежать проблем - сохранить скрипты во внешних файлах и использовать атрибут src для их включения.

Ответ 2

Да, модель контента STYLE и SCRIPT является специальной:

Хотя элементы STYLE и SCRIPT используют CDATA для своей модели данных, для этих элементов CDATA должен обрабатываться по-разному с помощью пользовательских агентов. Разметка и объекты должны рассматриваться как необработанные и передаваться в приложение как есть. Первое вхождение символьной последовательности "</" (разделитель открытого конца тега) рассматривается как завершение конца содержимого элемента. В действительных документах это будет конечным тегом для элемента.