JavaScript. Подробное руководство, 6-е издание, стр. 227

<b>&lt;script&gt;</b>

<b>  document.write(&quot;&lt;p&gt;3arоловок документа: &quot; + document.title);</b>

<b>  document.write(&quot;&lt;br&gt;URL: &quot; + document.URL);</b>

<b>  document.write(&quot;&lt;br&gt;Ссылающийся на него документ: &quot; + document, referrer);</b>

<b>  document.write(&quot;&lt;br&gt;изменен: &quot; + document.lastModified);</b>

<b>  document.write(&quot;&lt;br&gt;Открыт: &quot; + new Date());</b>

<b>&lt;/script&gt;</b>

Важно понимать, что метод

<b>write()</b>
можно использовать для вывода разметки HTML только в процессе синтаксического анализа документа. То есть вызывать метод
<b>document.write()</b>
из программного кода верхнего уровня в теге
<b>&lt;script&gt;</b>
можно только в случае, если выполнение сценария является частью процесса анализа документа. Если поместить вызов
<b>document.write()</b>
в определение функции и затем вызвать эту функцию из обработчика события, результат окажется неожиданным - этот вызов уничтожит текущий документ и все содержащиеся в нем сценарии! (Почему это происходит, будет описано чуть ниже.) По тем же причинам нельзя использовать
<b>document.write()</b>
в сценариях с установленными атрибутами
<b>defer</b>
или
<b>async</b>
.

Пример 13.3 в главе 13 использует метод

<b>document.write()</b>
указанным способом чтобы сгенерировать более сложный вывод.

Метод

<b>write()</b>
можно использовать для создания полностью новых документов в других окнах и фреймах. (Однако при работе с другими окнами и фреймами необходимо позаботиться о том, чтобы не нарушать политику общего происхождения.) Первый вызов метода
<b>write()</b>
другого документа полностью уничтожит имеющееся содержимое этого документа. Метод
<b>write()</b>
можно вызывать многократно, тем самым добавляя новое содержимое в документ. Содержимое, передаваемое методу
<b>write(),</b>
может буферизоваться (и не отображаться), пока не будет выполнен завершающий вызов метода
<b>close()</b>
объекта документа, сообщающий парсеру, что работа с документом окончена и он может выполнить разбор документа и отобразить его.

Следует отметить, что объект

<b>Document</b>
поддерживает также метод
<b>writeln(),</b>
который идентичен методу
<b>write(),</b>
за исключением того, что он добавляет символ перевода строки после вывода своих аргументов. Это может пригодиться, например, при выводе форматированного текста внутри элемента
<b>&lt;рге&gt;</b>
.

Метод

<b>document.write()</b>
редко используется в современных сценариях: свойство
<b>innerHTML</b>
и другие приемы, поддерживаемые моделью DOM, обеспечивают более удачные способы добавления содержимого в документ. С другой стороны, некоторые алгоритмы лучше укладываются в схему потокового ввода/вывода, реализуемую методом
<b>write().</b>
Если вы создаете сценарий, который динамически генерирует и выводит текст в процессе своего выполнения, вам, возможно, будет интересно ознакомиться с примером 15.10, в котором свойство
<b>innerHTML</b>
указанного элемента обертывается простыми методами
<b>write()</b>
и
<b>close().</b>

Пример 15.10. Интерфейс потоков ввода-вывода к свойству innerHTML

<b>// Определить простейший интерфейс &quot;потоков ввода/вывода” для свойства innerHTML элемента</b>

<b>function ElementStream(elt) {</b>

<b>  if (typeof elt === &quot;string”) elt = document.getElementByld(elt);</b>

<b>    this.elt = elt; this.buffer = &quot;”;</b>

<b>}</b>

<b>// Объединяет все аргументы и добавляет в буфер </b>

<b>ElementStream.prototype.write = function() {</b>

<b>  this.buffer += Array.prototype.join.call(arguments,</b>

<b>};</b>

<b>// To же, что и write(), но добавляет символ перевода строки </b>

<b>ElementStream.prototype.writeln = function() {</b>

<b>  this.buffer += Array.prototype.join.call(arguments, &quot;&quot;) + &quot;\n&quot;;</b>

<b>};</b>

<b>// Переносит содержимое буфера в элемент и очищает буфер.</b>

<b>ElementStream.prototype.close = function() {</b>

<b>  this.elt.innerHTML = this.buffer; this.buffer = &quot;&quot;;</b>

<b>};</b>

15.10.3. Получение выделенного текста

Иногда удобно иметь возможность определять, какой участок текста документа выделен пользователем. Сделать это можно, как показано ниже:

<b>function getSelectedText() {</b>

<b>  if (window.getSelection) // Функция, определяемая стандартом HTML5 </b>

<b>    return window.getSelection().toString();</b>

<b>  else </b>

<b>    if (document.selection) // Прием, характерный для IE.</b>

<b>      return document.selection.createRange().text;</b>

<b>}</b>