Дизайнерское решение - зачем генерировать <p> без </ p>?

14

ТЛ; др

Некоторые широко используемые программы, которые генерируют html, будут генерировать только открывающие теги абзацев, а не закрывающие, при условии, что браузер правильно закроет абзацы.

На первый взгляд, мне кажется, что предположение о том, что браузеры будут правильно закрывать абзацы, неверно. Правильна ли моя интерпретация? В целом, какие компромиссы связаны с таким решением?


Просматривая исходный код moinmoin, мне попалась следующая строка кода:

# We only open those tags and let the browser auto-close them:
_auto_closing_tags = set(['p'])

( источник )

Прочитав остальную часть реализации, я убедил себя, что да, действительно, когда moinmoin генерирует html-код для одной из своих страниц, он будет правильно генерировать открытые теги абзаца, где это уместно, и в то же время целенаправленно избегать любого из теги закрытия абзаца (несмотря на то, что это можно сделать тривиально).

Для моего конкретного, довольно необычного варианта использования это поведение не является правильным. Я испытываю желание отправить сообщение об ошибке и / или изменить поведение. Тем не менее, похоже, что это дизайнерское решение было продуманно принято. Я недостаточно хорошо разбираюсь в тонкостях стандарта html или различных реализаций браузера, чтобы понять, является ли это правильным поведением в целом, и у меня есть ощущение, что мой инстинкт исправления / изменения этого поведения может быть ошибочный.

Этот код делает правильное предположение о реализации браузера? Является ли созданный HTML действительным? В целом, какие компромиссы я мог бы упустить здесь?

blueberryfields
источник
2
Несмотря на текущие ответы, это выглядит как дебильный дизайн. «Будьте либеральны в том, что вы принимаете, и консервативны в том, что вы посылаете» и все такое. Это также совершенно ненужно. Я бы определенно отправил (строго сформулированный) отчет об ошибке в Moinmoin. По крайней мере, они должны четко задокументировать и прокомментировать это не интуитивное поведение.
Конрад Рудольф

Ответы:

33

Конечные теги для pэлементов были необязательными в HTML и требовались только в XHTML. Однако в проекте HTML5 представлен набор условий, когда pконечный тег фактически необязателен:

Конечный тег элемента p может быть опущен, если за элементом p сразу следует адрес, статья, в стороне, цитата, dir, div, dl, fieldset, нижний колонтитул, форма, h1, h2, h3, h4, h5, h6, заголовок , hgroup, hr, menu, nav, ol, p, pre, section, table или ul, element, или если в родительском элементе больше нет содержимого, а родительский элемент не является элементом.

Источник: спецификация HTML5

Тем не менее, единственный аргумент, который я когда-либо слышал за пропуск конечных тегов для pэлементов, - это размер документа. Вам решать, имеет ли это смысл для вашего документа или нет. Лично я склонен включать все дополнительные конечные теги, на случай, если я не отвечаю требованиям, когда конечный тег является необязательным.

Яннис
источник
5
Думаю, великие умы похожи. :)
Роберт Харви
@RobertHarvey Вы выиграли в этом раунде, на 12 секунд ...
Яннис
2
Еще один аргумент в пользу пропуска конечных тегов: они очевидны из структуры документа, а при неправильном использовании могут также вводить ложные пробелы.
Джон Перди
1
Возможность опускать конечные теги была явной особенностью дизайна SGML, на котором был основан HTML. Это также явно НЕ было функцией XML, на которой основан XHTML.
Алан Шутко
4
Я часто вижу один аргумент в том, что это выглядит чище. В частности, в случае <li>тегов теги больше похожи на маркеры.
Рассерженная шлюха
16

Спецификация W3C для HTML5 специально гласит, что:

Конечный тег элемента p может быть опущен, если за элементом p сразу следует адрес, статья, в стороне, цитата, dir, div, dl, fieldset, нижний колонтитул, форма, h1, h2, h3, h4, h5, h6, заголовок , hr, menu, nav, ol, p, pre, section, table или ul, или если в родительском элементе больше нет содержимого, а родительский элемент не является элементом.

Таким образом, в основном спецификация предоставила множество способов, которыми можно избежать сложности (большой или маленькой) закрытия тега. Любая соответствующая реализация браузера должна учитывать эти исключения.

Роберт Харви
источник