Исследование объекта Document начнется с метода write(), который позволяет за_ писывать содержимое в тело документа. Этот метод относится к унаследованной части DOM, и начиная с самых ранних версий JavaScript метод document.write() можно было использовать двумя способами. Первый и самый простой способ –
316 Глава 15. Работа с документами
вывести HTML_текст из сценария в тело документа, анализ которого производится в текущий момент. Рассмотрим следующий фрагмент, где в статический HTML_ документ с помощью метода write() добавляется информация о текущей дате:
Необходимо отметить, что вывод текста в формате HTML в текущий документ возможен только в процессе его синтаксического анализа. То есть вызывать ме_ тод document.write() из программного кода верхнего уровня в теге <script> можно только в том случае, если исполнение сценария является частью процесса анали_ за документа. Если поместить вызов document.write() в определение функции и затем вызвать эту функцию из обработчика события, результат окажется не_ ожиданным – фактически этот вызов уничтожит текущий документ и все содер_ жащиеся в нем сценарии! (Причины такого поведения вскоре будут описаны.)
Метод document.write() вставляет текст в то место HTML_документа, где находит_ ся тег <script>, содержащий вызов метода. Если тег <script> помечен атрибутом defer, он не должен содержать никаких обращений к методу document.write(). Ат_ рибут defer сообщает веб_броузеру, что исполнение сценария может быть отложе_ но до того момента, когда документ будет полностью загружен. Но когда это про_ изойдет, будет уже слишком поздно вставлять дополнительное содержимое в до_ кумент методом document.write(), поскольку разбор документа уже закончится.
Использование метода write() для создания содержимого документа в процессе его разбора – это широко распространенная практика JavaScript_программиро_ вания. Ныне стандарт W3C DOM позволяет вставлять содержимое (с помощью описываемых далее приемов) в любую часть документа уже после того, как за_ кончится его анализ. Тем не менее применение метода document.write() по_преж_ нему является делом вполне обычным.
Кроме того, метод write() можно использовать (совместно с методами open() и close() объекта Document) для создания полностью новых документов в других окнах и фреймах. Хотя возможность выполнить запись в текущий документ из обработчика события отсутствует, нет никаких причин, которые могли бы вос_ препятствовать выполнить запись в документ в другом фрейме или окне – это может оказаться удобным при создании многооконных веб_приложений или страниц с несколькими фреймами. Например, можно было бы создать всплы_ вающее окно и записать в него некоторый HTML_код следующим образом:
// Эта функция открывает всплывающее окно. Она должна вызываться из обработчика события,
// в противном случае всплывающее окно, скорее всего, будет заблокировано
function hello() {
var w = window.open(); // Создать новое пустое окно
var d = w.document; // Получить ссылку на объект Document
d.open(); // Начать новый документ (необязательно)
Чтобы создать новый документ, прежде всего нужно вызвать метод open() объек_ та Document, затем вызвать несколько раз метод write(), чтобы вывести содержи_
15.2. Свойства объекта Document
мое документа, и наконец вызвать метод close() объекта Document, чтобы указать, что работа с документом окончена. Этот последний шаг очень важен – если не за_ крыть документ, броузер будет продолжать показывать, что идет загрузка доку_ мента. Кроме того, броузер может буферизовать только что записанный HTML_ текст и не отображать его, пока документ не будет явно закрыт методом close().
В отличие от метода close(), вызывать метод open() не обязательно. Если метод write() вызывается для уже закрытого документа, интерпретатор JavaScript не_ явно открывает новый HTML_документ, как если бы перед первым вызовом write() стоял вызов open(). Это объясняет происходящее, когда вызов метода document.write() производится из обработчика события в том же самом докумен_ те: JavaScript открывает новый документ. В результате текущий документ (и все его содержимое, включая сценарии и обработчики событий) уничтожается. Главное правило, которое следует соблюдать: метод write() никогда не должен вызываться для записи в тот же самый документ из обработчиков событий.
Два последних замечания по поводу метода write(). Во_первых, многие еще не понимают, что метод write() способен принимать более одного аргумента. Когда методу передаются несколько аргументов, они выводятся один за другим, как если бы были объединены в одну строку. Например:
document.write("Привет, " + username + " Добро пожаловать на мою страницу!");
Этот вызов можно заменить следующим фрагментом:
var greeting = "Привет, ";
var welcome = " Добро пожаловать на мою страницу!"; document.write(greeting, username, welcome);
Во_вторых, объект Document поддерживает еще один метод – writeln(), который идентичен методу write() за исключением того, что после вывода последнего ар_ гумента добавляет символ перевода строки. Это может оказаться удобным, на_ пример, при выводе отформатированного текста в теге <pre>.
Полное описание методов write(), writeln(), open() и close() вы найдете в четвер_ той части книги в том разделе, в котором описывается объект HTMLDocument.