Чтобы увидеть проблему, посмотрите на верхнюю строку в элементе скрипта:
<script type="text/javascript">
document.write('<script src="set1.aspx?v=1234" type="text/javascript"></script>');
</script>
Итак, HTML-парсер обнаруживает открывающий тег . Внутри нормальный синтаксический анализ отключен (в терминах SGML элемент имеет содержимое CDATA). Чтобы определить, где заканчивается блок скрипта, анализатор HTML ищет соответствующий закрывающий тег .
Первый найденный - строковый литерал. Анализатор HTML не может знать, что он находится внутри строкового литерала, потому что анализаторы HTML ничего не знают о синтаксисе JavaScript, они знают только о CDATA. Итак, что вы на самом деле говорите:
<script type="text/javascript">
document.write('<script src="set1.aspx?v=1234" type="text/javascript">
</script>
То есть незамкнутый строковый литерал и незавершенный вызов функции. Это приводит к ошибкам JavaScript, и нужный тег сценария никогда не записывается.
Типичная попытка решить проблему:
document.write('...</scr' + 'ipt>');
Это все еще технически неправильно (и не будет проверяться). Это связано с тем, что в SGML последовательность символов, которая заканчивается элементом CDATA, на самом деле не is ’, а просто‘ </ ’- последовательность, которая все еще присутствует в строке выше. Браузеры, как правило, более снисходительны и на практике это позволят. </p>
Вероятно, лучшее решение - избежать последовательности. Есть несколько возможностей, но самый простой - использовать строковые литералы JavaScript ('\ xNN'):
document.write('\x3Cscript src="set1.aspx?v=1234\x26w=5678" type="text/javascript"\x3E\x3C/script\x3E');
Приведенное выше экранирует все символы «<», «>» и «&», что не только останавливает последовательность «</», появляющуюся в строке, но и позволяет вставлять ее в блок сценария XHTML, не вызывая ошибок . </p>
(В XHTML такой вещи, как элемент CDATA, не существует, поэтому эти символы будут иметь то же значение, что и при включении в обычный контент, а строка «» внутри блока сценария фактически создаст вложенный элемент сценария ! Можно разрешить <> & в блоке скрипта XHTML, используя раздел <! [CDATA [, но это немного уродливо и обычно лучше избегать использования этих символов во встроенном скрипте.) </p>