Каковы все допустимые самозакрывающиеся элементы в XHTML (как это реализовано основными браузерами)?
-
01-07-2019 - |
Вопрос
Каковы все допустимые самозакрывающиеся элементы (например<br />) в XHTML (как реализовано основными браузерами)?
Я знаю, что XHTML технически позволяет любому элементу быть самозакрывающимся, но я ищу список этих элементов, поддерживаемых всеми основными браузерами.Видишь http://dusan.fora.si/blog/self-closing-tags приведены примеры некоторых проблем, вызванных самозакрывающимися элементами, такими как <div />.
Решение
Каждый браузер, поддерживающий XHTML (Firefox, Opera, Safari, IE9) поддерживает самозакрывающийся синтаксис на каждый элемент.
<div/>
, <script/>
, <br></br>
все должно работать просто отлично.Если они этого не сделают, то у вас есть HTML с неуместно добавленным типом ДОКУМЕНТА XHTML.
DOCTYPE не изменяет способ интерпретации документа. Только MIME-тип выполняет.
Решение W3C об игнорировании DOCTYPE:
Рабочая группа по HTML обсудила этот вопрос:намерение состояло в том, чтобы разрешить старым (только для HTML) браузерам принимать документы XHTML 1.0, следуя рекомендациям и предоставляя их в виде текста / html.Следовательно, документы, предоставляемые как text / html, следует обрабатывать как HTML, а не как XHTML.
Это очень распространенная ошибка, потому что W3C Validator в значительной степени игнорирует это правило, но браузеры неукоснительно ему следуют.Читать Понимание HTML, XML и XHTML из блога WebKit:
Фактически, подавляющее большинство предположительно XHTML-документов в Интернете подаются как
text/html
.Это означает, что они вообще не являются XHTML, а фактически недопустимым HTML, который возникает при обработке ошибок парсеров HTML.Все эти ссылки “Допустимый XHTML 1.0!” в Интернете на самом деле говорят “Недопустимый HTML 4.01!”.
Чтобы проверить, есть ли у вас реальный XHTML или недопустимый HTML с DOCTYPE XHTML, поместите это в свой документ:
<span style="color:green"><span style="color:red"/>
If it's red, it's HTML. Green is XHTML.
</span>
Он проверяет правильность, и в реальном XHTML он работает отлично (см.: 1 против 2).Если вы не можете поверить своим глазам (или не знаете, как настроить типы MIME), откройте свою страницу через Прокси -сервер XHTML.
Другой способ проверить - просмотреть исходный код в Firefox.Косые черты будут выделены красным цветом, если они недопустимы.
В HTML5 / XHTML5 это не изменилось, и различие еще более четкое, потому что у вас даже нет дополнительных DOCTYPE
. Content-Type
это король.
Для справки, спецификация XHTML позволяет любому элементу быть самозакрывающимся, делая XHTML XML-приложение:[курсив мой]
Теги с пустыми элементами могут использоваться для любой элемент, который не имеет содержимого, независимо от того, объявлено оно с использованием ключевого слова EMPTY или нет.
Это также явно показано в Спецификация XHTML:
Пустые элементы должны либо иметь конечный тег или начальный тег должен заканчиваться на
/>
.Например,<br/>
или<hr></hr>
Другие советы
Одним из элементов, с которым следует быть очень осторожным в этой теме, является <script
> элемент.Если у вас есть внешний исходный файл, это вызовет проблемы, когда вы самостоятельно закроете его.Попробуй это:
<!-- this will not consistently work in all browsers! -->
<script type="text/javascript" src="external.js" />
Это будет работать в Firefox, но ломается, по крайней мере, в IE6.Я знаю, потому что я столкнулся с этим, когда чрезмерно усердно закрывал каждый элемент, который я видел;-)
Самозакрывающийся синтаксис работает со всеми элементами в application /xhtml + xml.Он не поддерживается ни для одного элемента в text / html, но элементы, которые являются “пустыми” в HTML4 или “void” в HTML5, в любом случае не имеют конечного тега, поэтому, если вы добавите косую черту к ним, это будет выглядеть так, как будто поддерживается самозакрывающийся синтаксис.
Из самого Справочный сайт школ W3:
<area />
<base />
<basefont />
<br />
<hr />
<input />
<img />
<link />
<meta />
Лучшим вопросом было бы:какие теги могут быть самозакрывающимися даже в режиме HTML, не влияя на код?Ответ:только те, которые имеют пустое содержимое (являются недействительными).Согласно Спецификации HTML следующие элементы являются недействительными:
area, base, br, col, embed, hr, img, input, keygen, link, menuitem, meta, param, source, track, wbr
Также указана более старая версия спецификации command
.Кроме того, согласно различным источникам, следующие устаревшие или нестандартные теги недействительны:
basefont, bgsound, frame, isindex
Надеюсь, это кому-то поможет:
<base />
<basefont />
<frame />
<link />
<meta />
<area />
<br />
<col />
<hr />
<img />
<input />
<param />
О чем <meta>
и <link>
?Почему их нет в этом списке?
Краткое эмпирическое правило: не закрывайте самостоятельно ни один элемент, предназначенный для содержимого, потому что рано или поздно это определенно вызовет проблемы с браузером.
Те, которые естественным образом самозакрываются, например <br>
и <img>
, должно быть очевидным.Те , которых нет ...только не закрывайте их самостоятельно!
В последний раз, когда я проверял, ниже были перечислены элементы empty / void в HTML5.
Действительно для авторов:область, база, br, col, команда, вставка, eventsource, hr, img, входные данные, ссылка, meta, параметр, источник
Недопустимо для авторов:базовый шрифт, bgsound, рамка, распорка, wbr
Помимо нескольких новых в HTML5, это должно дать вам представление о тех, которые могут поддерживаться при использовании XHTML в виде текста / html.(Просто протестируйте их, изучив созданный DOM.)
Что касается XHTML, используемого как application / xhtml + xml (что делает его XML), применяются правила XML, и любой элемент может быть пустым (даже если DTD XHTML не может выразить это).
Вам следует взглянуть на xHTML DTDS, они все перечислены.Вот краткий обзор всех основных из них:
<br />
<hr />
<img />
<input />
В HTML 5 они называются элементами "void".Они перечислены в официальная спецификация W3.
Элемент void - это элемент, модель содержимого которого ни при каких обстоятельствах не позволяет ему иметь содержимое.
По состоянию на апрель 2013 года они составляют:
область, база, br, col, команда, вставка, hr, img, ввод, кейген, ссылка, meta, параметр, исходный код, трек, wbr
По состоянию на декабрь 2018 года (HTML 5.2), они следующие:
область, база, br, col, вставка, hr, img, входные данные, ссылка, meta, параметр, исходный код, трек, wbr
Другой проблемой самозакрывающегося тега для IE является элемент title.Когда IE (только что попробовал это в IE7) видит это, он представляет пользователю пустую страницу.Однако вы "просматриваете исходный код", и все есть там.
<title/>
Первоначально я увидел это, когда мой XSLT сгенерировал самозакрывающийся тег.
Я не собираюсь переусердствовать в этом, тем более что большинство страниц, которые я пишу, либо сгенерированы, либо в теге действительно есть содержимое.Единственные два, которые когда-либо доставляли мне проблемы при их самозакрывании, - это:
<title/>
Для этого я просто прибегал к тому, чтобы всегда присваивать ему отдельный закрывающий тег, поскольку, как только он появляется в <head></head>
в любом случае, на самом деле это не делает ваш код более сложным для работы.
<script/>
Это тот самый большой проект, с которым я совсем недавно столкнулся с проблемами.В течение многих лет я всегда пользовался самозакрывающимся <script/>
теги, когда скрипт поступает из внешнего источника.Но я совсем недавно начал получать сообщения об ошибках JavaScript о нулевой форме.После нескольких дней исследований я обнаружил, что проблема заключалась (предположительно) в том, что браузер никогда не получал доступ к <form>
тег, потому что он не понимал, что это конец игры. <script/>
бирка.Поэтому, когда я превратил это в отдельный <script></script>
теги, все сработало.Почему разные страницы, которые я создал в одном браузере, отличаются, я не знаю, но для меня было большим облегчением найти решение!
<hr /> это другой