HTML | Вставка динамической разметки

HTML | Вставка динамической разметки

Примечание

API для динамической вставки разметки в документ взаимодействуют с синтаксическим анализатором, поэтому их поведение зависит от того, используются ли они с документами HTMLсинтаксическим анализатором HTML) или XML-документамисинтаксическим анализатором XML).

Объекты документа Document имеют счетчик вставки динамической разметки (throw-on-dynamic-markup-insertion counter), который используется в сочетании с созданием элемента для алгоритма токена, чтобы предотвратить использование конструкторами пользовательских элементов document.open(), document.close() и document.write(), когда они вызываются синтаксическим анализатором. Первоначально счетчик должен быть установлен на ноль.

 

8.4.1 Открытие входного потока

Для веб-разработчиков (не нормативно)

document = document.open()

Вызывает замену Document на месте, как если бы это был новый объект Document, но с повторным использованием предыдущего объекта, который затем возвращается.

Результирующий Document имеет связанный с ним анализатор HTML, которому можно передать данные для анализа с помощью document.write().

Метод не действует, если Document все ещё анализируется.

Выдаёт исключение DOMException «InvalidStateError«, если документ Document является XML-документом.

Выдаёт исключение DOMException «InvalidStateError«, если синтаксический анализатор в данный момент выполняет конструктор пользовательского элемента.

window = document.open(urlnamefeatures)

Работает как метод window.open().

 

Объекты документа Document имеют активный синтаксический анализатор был прерван (active parser was aborted) логическим значением, которое используется для предотвращения вызова сценариями методов document.open() и document.write() (прямо или косвенно) после того, как активный синтаксический анализатор документа был прерван. Оно изначально ложно.

 

Шаги открытия документа (document open steps) для данного документа document следующие:

1. Если документ document является XML-документом, создайте исключение DOMException "InvalidStateError".
2. Если счётчик вставки динамической разметки документа document больше 0, создайте исключение DOMException "InvalidStateError".
3. Пусть entryDocument будет, связанным Document с глобальным объектом записи.
4. Если источник документа document не совпадает с источником entryDocument, создайте исключение DOMException "SecurityError".
5. Если у документа document есть активный парсер, уровень вложенности скриптов которого больше 0, то вернуть document.
Примечание

Это в основном приводит к тому, что document.open() игнорируется, когда он вызывается во встроенном скрипте, найденном во время синтаксического анализа, в то же время позволяя ему иметь эффект при вызове из задачи без синтаксического анализа, такой как обратный вызов таймера или обработчик событий.

6. Точно так же, если счётчик выгрузки документа document больше 0, верните документ document.
Примечание

В основном это приводит к тому, что document.open() игнорируется, когда он вызывается из обработчика событий beforeunload, pagehide или unload во время выгрузки документа Document.

7. Если активный синтаксический анализатор был прерван у документа document, имеет значение true, то вернуть документ document.
Примечание

В частности, это приводит к тому, что document.open() игнорируется, если он вызывается после начала навигации, но только во время начального синтаксического анализа. Дополнительные сведения см. в выпуске № 4723.

8. Если контекст просмотра документа document не равен null и существует попытка навигации по контексту просмотра документа document, остановите загрузку документа данного документа document.
Опасность

В выпуске № 3447 рассматривается различие между текущим экземпляром алгоритма навигации и задачами навигации, которые все еще находятся в очереди. В целях реализации этого шага как текущий экземпляр алгоритма навигации, так и задачи, поставленные в очередь для навигации, должны учитываться как «существующая попытка навигации», по крайней мере, до тех пор, пока эта проблема не будет решена.

9. Для каждого теневого включающего потомка node из document удалите все прослушиватели событий и обработчики, заданные node.
10. Если документ document является связанным документом Document с соответствующим глобальным объектом документа document, то удалите все прослушиватели событий и обработчики, данные соответствующему глобальному объекту документа document.
11. Замените всё на null в документе document, не запуская никаких событий мутации.
12. Если документ document полностью активен, то:
  12.1 Пусть newURL будет копией URL-адреса entryDocument.
  12.2 Если entryDocument не является документом document, установите для фрагмента newURL значение null.
  12.3 Запустите этапы обновления URL и истории с помощью document и newURL.
13. Установите исходное значение about:blank документа document на false.
14. Если установлен флаг прогресса загрузки iframe документа document в процессе, то установите флаг отключить загрузку iframe документа document.
15. Установите документ document в режим отсутствия причуд.
16. Создайте новый парсер HTML и свяжите его с document. Это синтаксический анализатор, созданный сценарием (script-created parser) (это означает, что он может быть закрыт методами document.open() и document.close(), и что токенизатор будет ждать явного вызова document.close(), прежде чем выдать end- токен файла). Достоверность кодирования не имеет значения - является irrelevant.
17. Установите точку вставки так, чтобы она указывала непосредственно перед концом входного потока (который в этот момент будет пустым).
18. Обновите текущую готовность документа document до "loading".
Примечание

Это приводит к срабатыванию события readystatechange, но на самом деле это событие не наблюдается для кода автора из-за предыдущего шага, который стёр все прослушиватели и обработчики событий, которые могли его наблюдать.

19. Вернуть document.
Примечание

Шаги открытия документа не влияют на то, готов ли документ Document к задачам пост-загрузки или полностью загружен.

 

Метод open(unused1, unused2) должен возвращать результат выполнения шагов открытия документа с объектом контекста this.

Примечание

Аргументы unused1 и unused2 игнорируются, но сохраняются в IDL, чтобы код, вызывающий функцию с одним или двумя аргументами, мог продолжать работу. Они необходимы из-за правил алгоритма разрешения перегрузки Web IDL, которые вызовут исключение TypeError для таких вызовов, если аргументы отсутствуют. Вопрос #581 исследует изменение алгоритма, чтобы разрешить их удаление. [WEBIDL]

 

Метод open(url, name, features) должен выполнить следующие шаги:

1. Если объект контекста this не активный документ, создайте исключение DOMException "InvalidAccessError".
2. Возвращает результат выполнения шагов открытия окна с URL-адресом url, именем name и функциями features.

})

 

8.4.2 Закрытие входного потока

Для веб-разработчиков (не нормативно)

document.close()

Закрывает входной поток, который был открыт методом document.open().

Выдает исключение DOMException «InvalidStateError«, если документ Document является XML-документом.

Выдает исключение DOMException «InvalidStateError«, если синтаксический анализатор в данный момент выполняет конструктор пользовательского элемента.

 

Метод close() должен выполнять следующие шаги:

1. Если объект Document является XML-документом, создайте исключение DOMException "InvalidStateError".
2. Если счётчик вставки динамической разметки объекта Document больше нуля, создайте исключение DOMException "InvalidStateError".
3. Если с документом не связан парсер, созданный сценарием, вернитесь.
4. Вставьте явный символ "EOF" в конце входного потока синтаксического анализатора.
5. Если есть ожидающий скрипт блокировки синтаксического анализа, вернитесь.
6. Запустите токенизатор, обрабатывая полученные токены по мере их создания и останавливаясь, когда токенизатор достигает явного символа "EOF" или запускает цикл обработки событий.

 

8.4.3 document.write()

Для веб-разработчиков (не нормативно)

document.write(…text)

В общем, добавляет заданную строку (строки) во входной поток документа Document.

Опасность

Этот метод имеет очень своеобразное поведение. В некоторых случаях этот метод может влиять на состояние анализатора HTML во время его работы, что приводит к тому, что DOM не соответствует источнику документа (например, если записанная строка является строкой «<plaintext>» или «<!—«). В других случаях вызов может сначала очистить текущую страницу, как если бы был вызван document.open(). В ещё большем количестве случаев метод просто игнорируется или выдает исключение. Пользовательским агентам явно разрешено избегать выполнения элементов сценария script, вставленных с помощью этого метода. И что ещё хуже, точное поведение этого метода может в некоторых случаях зависеть от сетевой задержки, что может привести к сбоям, которые очень трудно отладить. По всем этим причинам использование этого метода настоятельно не рекомендуется.

Выдает исключение DOMException «InvalidStateError» при вызове XML-документов.

Выдает исключение DOMException «InvalidStateError«, если синтаксический анализатор в данный момент выполняет конструктор пользовательского элемента.

 

Объекты документа Document имеют счетчик игнорирования деструктивной записи (ignore-destructive-writes counter), который используется в сочетании с обработкой элементов сценария script, чтобы предотвратить использование внешними сценариями документа document.write() для уничтожения документа путем неявного вызова document.open(). Первоначально счётчик должен быть установлен на ноль.

 

Шаги записи документа (document write steps), учитывая документ document объекта Document и строки ввода input, следующие:

1. Если документ document является XML-документом, создайте исключение DOMException "InvalidStateError".
2. Если счётчик вставки динамической разметки документа document больше 0, создайте исключение DOMException "InvalidStateError".
3. Если активный синтаксический анализатор был прерван из документа document, имеет значение true, тогда вернитесь.
4. Если точка вставки не определена, то:
  4.1 Если счётчик выгрузки документа document больше 0 или счётчик игнорирования деструктивной записи больше 0, вернитесь.
  4.2 Запустите шаги открытия документа с помощью document.
5. Вставьте ввод input во входной поток непосредственно перед точкой вставки.
6. Если нет ожидающего сценария блокировки синтаксического анализа, обработайте входные данные input синтаксического анализатора HTML, по одной кодовой точке за раз, обрабатывая полученные токены по мере их создания и останавливаясь, когда токенизатор достигает точки вставки или когда обработка токенизатора прерывается. на этапе построения дерева (это может произойти, если маркер конечного тега скрипта script генерируется токенизатором).
Примечание

Если метод document.write() был вызван из встроенного скрипта (т. е. из-за того, что синтаксический анализатор проанализировал набор тегов скрипта script), то это повторный вызов синтаксического анализатора. Если установлен флаг паузы синтаксического анализатора, токенизатор немедленно прервется, и HTML не будет анализироваться в соответствии с флагом проверки паузы синтаксического анализатора токенизатора.

Шаги метода document.write(…) заключаются в выполнении шагов записи документа с объектом контекста this и строкой, которая представляет собой конкатенацию всех переданных аргументов.

 

 

8.4.4 document.writeln()

Для веб-разработчиков (не нормативно)

document.writeln(…text)

Добавляет заданные строки во входной поток документа Document, за которыми следует символ новой строки. При необходимости сначала неявно вызывает метод open().

Выдает исключение DOMException «InvalidStateError» при вызове XML-документов.

Выдает исключение DOMException «InvalidStateError«, если синтаксический анализатор в данный момент выполняет конструктор пользовательского элемента.

 

Шаги метода document.writeln(…) заключаются в выполнении шагов записи документа с объектом контекста this и строкой, которая представляет собой конкатенацию всех переданных аргументов и U+000A LINE FEED.

 

Информационные ссылки

HTML | Оглавление

Стандарт HTML — Раздел «Dynamic markup insertion» — https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dynamic-markup-insertion