По-видимому, если у вас есть тег </p>
end без соответствующего начального тега внутри элемента body
, большинство, если не все браузеры будут генерировать пустой абзац на своем месте:
<!DOCTYPE html>
<title></title>
<body>
</p>
</body>
Даже если какой-либо текст существует вокруг конечного тега, ни один из них не является частью этого элемента p
- он всегда будет пустым, а текстовые узлы всегда будут существовать сами по себе:
<!DOCTYPE html>
<title></title>
<body>
some text</p>more text
</body>
Если вышеуказанное содержимое body
завернуто в теги <p>
и </p>
... Я оставлю вас догадываться, что происходит:
<!DOCTYPE html>
<title></title>
<body>
<p>some text</p>more text</p>
</body>
Интересно, что если тегу </p>
не предшествует тег <body>
или </body>
, все браузеры, за исключением IE9 и старше, не будут генерировать пустой абзац (IE ≤ 9, с другой стороны, всегда будет создавать один, в то время как IE10 и выше ведут себя так же, как и все другие браузеры):
<!DOCTYPE html>
<title></title>
</p>
<!DOCTYPE html>
<title></title>
</p><body>
<!DOCTYPE html>
<title></title>
</p></body>
Я не могу найти никаких ссылок, в которых указано, что конечный тег без соответствующего начального тега должен генерировать пустой элемент, но это не должно удивлять, учитывая, что он даже не корректный HTML в первую очередь. В самом деле, я нашел браузеры для этого с помощью элемента p
(и в какой-то мере это элемент br
!), Но не объяснения причин почему.
Он довольно согласован между браузерами, использующими как традиционные синтаксические анализаторы HTML, так и синтаксические анализаторы HTML5, хотя и применяется как в режиме quirks, так и в стандартном режиме. Поэтому, вероятно, справедливо вывести, что это для обратной совместимости с ранними спецификациями или традиционным поведением.
Фактически, я нашел этот комментарий в ответ на несколько смежный вопрос, который в основном подтверждает это:
Причина, по которой <p> теги действительны, так что первоначально <p> был определен как маркер "нового абзаца", а не p, являющийся элементом контейнера. Эквивалент <br> являясь маркером "новой строки". Вы можете видеть, как это определено в этом документе с 1992 года: http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/Tags.html, и этот с 1993 года: http://www.w3.org/MarkUp/draft-ietf-iiir-html-01.txt Поскольку в предварительных датах веб-страниц изменения и браузеры браузера всегда были как можно более совместимы с существующим веб-контентом, всегда оставалось возможным использовать <p> таким образом.
Но это не совсем объясняет, почему парсеры рассматривают явный тег </p>
end (с косой чертой) как простой... тег и генерируют пустой элемент в DOM. Является ли эта часть некоторого соглашения об обработке ошибок парсера от начала, когда синтаксис не был так строго определен, как он был больше недавно или что-то еще? Если да, то это где-нибудь зарегистрировано?