Как уже упоминалось, сценарий может вызывать метод document.write() для ди_ намического добавления содержимого в документ. Поэтому когда HTML_анали_ затор встречает сценарий, он должен прекратить разбор документа и ожидать, пока сценарий не завершит свою работу. Стандарт HTML 4 определяет атрибут defer для тега <script>, который имеет отношение к этой проблеме.
Если сценарий не выполняет какого_либо вывода в документ, например опреде_ ляет функцию document.write(), но нигде ее не вызывает, то с помощью атрибута defer тега <script> можно сообщить броузеру, чтобы он спокойно продолжал об_ работку HTML_документа и отложил исполнение сценария до тех пор, пока не будет найден сценарий, выполнение которого отложено быть не может. Задерж_ ка исполнения сценария полезна, когда сценарий загружается из внешнего фай_ ла; если исполнение сценария не задержать, броузер вынужден будет ждать окончания загрузки и только потом сможет продолжить разбор содержимого до_ кумента. Задержка исполнения может привести к повышению производительно_ сти броузеров, способных использовать преимущества атрибута defer. В HTML у атрибута defer не может быть значения; он просто должен присутствовать в теге:
<script defer>
// Любой JavaScript_код, не вызывающий document.write() </script>
Однако в XHTML значение этого атрибута должно быть указано:
<script defer="defer"></script>
К моменту написания этих строк Internet Explorer был единственным броузе_ ром, использующим атрибут defer. При этом задержка выполняется, только ко_ гда тег <script> содержит атрибут src. Однако реализация задержки выполнена не совсем корректно, поскольку исполнение сценария с атрибутом defer всегда откладывается до окончания разбора документа, а не до того момента, когда встретится первый сценарий, исполнение которого нельзя отложить. Это озна_ чает, что отложенные сценарии в IE могут исполняться не в том порядке, в кото_ ром они располагаются в теле документа. В результате некоторые функции или переменные, востребованные в сценариях, исполнение которых не откладыва_ лось, могут быть не определены.
13.2. Встраивание JavaScript*кода в HTML*документы
13.2.5. Тег <noscript>
Язык разметки HTML определяет элемент <noscript>, предназначенный для хра_ нения отображаемого содержимого на случай, когда в броузере включен режим, запрещающий исполнение JavaScript_кода. В идеале веб_страницы должны соз_ даваться так, чтобы JavaScript_код лишь расширял их функциональные воз_ можности, а в случае его отключения страницы сохраняли свою работоспособ_ ность. Однако если это невозможно, с помощью тега <noscript> можно известить пользователя о том, что требуется включить поддержку JavaScript и, возможно, предоставить ссылку на альтернативную страницу.
13.2.6. Тег </script>
В какой_то момент вам может потребоваться с помощью метода document.write() или свойства innerHTML вывести некоторый другой сценарий (обычно в другое ок_ но или фрейм). Тогда для завершения генерируемого сценария потребуется вы_ вести тег </script>. Здесь необходима осторожность – HTML_анализатор не пыта_ ется понять JavaScript_код, и встретив строку "/script" даже внутри кавычек, он предположит, что это закрывающий тег выполняемого в данный момент сцена_ рия. Чтобы обойти это препятствие, разбейте тег на части и запишите его, напри_ мер, в виде выражения "</" + "script>", как показано в следующем фрагменте:
<script>
f1.document.write("<script>"); f1.document.write("document.write('<h2>Это сценарий в кавычках</h2>')"); f1.document.write("</" + "script>");
</script>
В качестве альтернативы можно экранировать символ слэша / в теге </script> с помощью символа обратного слэша:
f1.document.write("<\/script>");
В XHTML сценарии заключаются в секцию CDATA и потому проблема с закрываю_ щим тегом </script> никак не проявляется.