Установка document.body.outerHTML создает пустые головы.Зачем? - PullRequest
0 голосов
/ 19 октября 2018

Сброс outerHTML свойства document.body имеет странный побочный эффект: он добавляет дополнительный пустой <head></head> в DOM, непосредственно перед body:

head { display: inline; counter-increment: h; border: 1px solid; }
head:last-of-type::after { content: 'Head elements count: ' counter(h); }
[onclick]::after { content: attr(onclick); }
<button onclick="document.body.outerHTML=document.body.outerHTML"></button>

Кажется, что все браузеры согласуются с этим.Мне сказали , что это определено именно так, но я не смог выкопать авторитетную позицию стандартов по этому поводу, даже не упомянув в архивах обсуждений.Знаете ли вы какой-то опыт или есть какая-то техническая причина?Есть идеи?

1 Ответ

0 голосов
/ 20 октября 2018

Интересный вопрос.К сожалению, объяснение скрыто в деталях алгоритма синтаксического анализа HTML , на который ссылается определение outerHTML в спецификации DOM Parsing.

Вам понадобитсяочень внимательно следить за состоянием синтаксического анализатора, чтобы понять почему, но по сути это работает так.При использовании externalHTML синтаксический анализатор инициализируется так, как будто он только что проанализировал начальный тег родительского узла данного узла.Для document.body это элемент html.

В алгоритме синтаксического анализа HTML, когда анализируется начальный тег html, следующее, что ожидает анализатор, - элемент head.Но поскольку в HTML начальный и конечный теги элемента head являются необязательными, если он не видит следующий начальный тег, он выводит один.Таким образом, в случае document.body.outerHTML следующая вещь, которую анализатор видит, это начальный тег body, поэтому сначала создается пустой элемент head.

Наконец, после разбора фрагмента всев DOM добавлен лот, включая выводимый элемент head.

...