Зачем разделять тег <script> при написании его с помощью document.write ()?

Почему некоторые сайты (или рекламодатели, которые предоставляют клиентам код JavaScript) используют технику разделения <script> и / или </script> теги внутри document.write() звонки?

Я заметил, что Amazon также делает это, например:

<script type='text/javascript'>
  if (typeof window['jQuery'] == 'undefined') document.write('<scr'+'ipt type="text/javascript" src="http://z-ecx.images-amazon.com/images/G/01/javascripts/lib/jquery/jquery-1.2.6.pack._V265113567_.js"></sc'+'ript>');
</script>

5 ответов

Решение

</script> должен быть разбит, потому что в противном случае это закончило бы <script></script> слишком рано На самом деле это должно быть разделено между < и / потому что предполагается, что блок сценария (согласно SGML) завершается любой последовательностью открытия конечного тега (ETAGO) (т.е. </ ):

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

Однако на практике браузеры заканчивают парсинг блока сценариев CDATA только на фактическом </script> крупный тег.

В XHTML нет такой специальной обработки для блоков скрипта, поэтому любой < (или же &) персонаж внутри них должен быть &escaped; как и в любом другом элементе. Однако, тогда браузеры, которые анализируют XHTML как HTML старой школы, запутаются. Существуют обходные пути, включающие блоки CDATA, но проще всего просто избегать использования этих символов без экранирования. Лучший способ написания элемента script из скрипта, который работает с любым типом парсера:

<script type="text/javascript">
    document.write('\x3Cscript type="text/javascript" src="foo.js">\x3C/script>');
</script>

Вот еще один вариант, который я использовал, когда хотел сгенерировать встроенный тег сценария (чтобы он выполнялся немедленно) без необходимости экранирования:

<script>
    var script = document.createElement('script');
    script.src = '/path/to/script.js';
    document.write(script.outerHTML);
</script>

(Примечание: вопреки большинству примеров в сети, я не устанавливаю type="text/javascript" ни в теге включения, ни в сгенерированном теге: нет браузера, не имеющего его в качестве значения по умолчанию, и поэтому он является избыточным, но также не повредит, если вы не согласны).

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