В процессе загрузки и синтаксического анализа документа программный код JavaScript_сценария, расположенный в теге <script>, имеет возможность вста_ вить содержимое в документ с помощью метода window.write(). Другие способы манипулирования документом, в которых используются приемы и методы DOM_ программирования и которые представлены в главе 15, в тегах <script> могут быть доступны или не доступны.
На первый взгляд большинство броузеров предоставляют сценариям возмож_ ность манипулировать любыми элементами документа, которые расположены перед тегом <script>. Некоторые JavaScript_программисты исходят из этого предположения. Однако ни в одном стандарте такое положение вещей не регла_ ментируется, и опытные JavaScript_программисты знают, что если не определе_ но обратное, манипулирование элементами документа из сценариев, размещен_ ных в тегах <script>, может вызывать проблемы (возможно лишь иногда, лишь в некоторых броузерах или лишь тогда, когда происходит перезагрузка доку_ мента или возврат к предыдущей странице после щелчка на кнопке Назад).
Единственное, что точно известно об этой темной области, – это то, что безопасно можно манипулировать документом лишь после возникновения события onload, и это обстоятельство учитывается при разработке большинства JavaScript_при_ ложений – в них событие onload служит «сигналом» для выполнения всех необ_ ходимых модификаций документа. Вспомогательная подпрограмма, выполняю_ щая регистрацию обработчиков события onload, представлена в примере 17.7.
Когда документ содержит большие изображения или много изображений, син_ таксический разбор главного документа может завершиться задолго до того, как будут загружены все изображения и произойдет событие onload. В этом случае может потребоваться начать модификации документа до возникновения события onload. Один из способов (наиболее безопасный из обсуждаемых) заключается в том, чтобы разместить программный код в конце документа. Для IE программ_ ный код можно поместить в тег <script> с установленными атрибутами defer и src, а для Firefox – оформить его в виде недокументированного обработчика события DOMContentLoad, которое возникает после разбора содержимого документа, но до загрузки всех внешних объектов, таких как изображения.
Другая темная область модели исполнения JavaScript_кода касается вопроса, мо_ гут ли обработчики событий вызываться до того, как документ полностью загру_ жен? До сих пор в нашем обсуждении модели исполнения JavaScript_кода мы придерживались мнения, что все обработчики событий всегда вызываются толь_ ко после того, как отработают все сценарии. Так обычно и происходит, но ника_ кие стандарты не требуют этого. Если документ очень объемный или загрузка до_ кумента происходит через медленное сетевое соединение, броузер может отобра_ зить часть документа и позволить пользователю взаимодействовать с ним (и соот_ ветственно запускать обработчики событий) до того, как исполнены все сценарии и вызван обработчик события onload. Если в такой ситуации обработчик события обратится к функции, которая еще не определена, он потерпит неудачу. Впрочем, на практике это случается достаточно редко, потому предпринимать дополни_ тельных усилий для реализации разного рода защитных мер не требуется.