Каковы все допустимые самозакрывающиеся элементы в XHTML (как это реализовано в основных браузерах)?
Каковы все допустимые самозакрывающиеся элементы (например,
) в XHTML (как реализовано в основных браузерах)?
Я знаю, что XHTML технически позволяет самозакрывать любой элемент, но я ищу список этих элементов, поддерживаемых всеми основными браузерами. См. http://dusan.fora.si/blog/self-closing-tags для примеров некоторых проблем, вызванных самозакрывающимися элементами, такими как
.13 ответов
Каждый браузер, поддерживающий XHTML (Firefox, Opera, Safari, IE9), поддерживает самозакрывающийся синтаксис для каждого элемента.
<div/>
, <script/>
, <br></br>
все должно работать просто отлично. Если они этого не делают, то у вас есть HTML с неправильно добавленным XHTML DOCTYPE.
DOCTYPE не меняет интерпретацию документа. Только MIME-тип.
Решение W3C об игнорировании DOCTYPE:
Рабочая группа по HTML обсуждала эту проблему: предполагалось, что старые браузеры (только для HTML) смогут принимать документы XHTML 1.0, следуя рекомендациям, и отображать их как text/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 или "пустыми" в HTML5, в любом случае не принимают конечный тег, поэтому, если вы добавите косую черту к ним, он будет выглядеть как Самозакрывающийся синтаксис был поддержан.
Со справочного сайта W3 Schools:
<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 />
Они называются "пустыми" элементами в HTML 5. Они перечислены в официальной спецификации W3.
Элемент void - это элемент, модель содержимого которого никогда не позволяет иметь содержимое ни при каких обстоятельствах.
По состоянию на апрель 2013 года они являются:
область, база, br, col, команда, вставка, hr, img, ввод, keygen, ссылка, мета, параметр, источник, трек, wbr
Как насчет <meta>
а также <link>
? Почему их нет в этом списке?
Быстрое эмпирическое правило, не закрывайте самостоятельно какой-либо элемент, который предназначен для содержания, потому что это определенно вызовет проблемы браузера рано или поздно.
Те, которые естественно самозакрывающиеся, как <br>
а также <img>
, должно быть очевидно. Те, которые не... просто не закрывайте их сами!
Вы должны посмотреть DTD xHTML, они все перечислены. Вот краткий обзор всех основных:
<br />
<hr />
<img />
<input />
В прошлый раз, когда я проверял, ниже были пустые / пустые элементы, перечисленные в HTML5.
Действительно для авторов: area, base, br, col, команда, embed, источник событий, hr, img, вход, ссылка, meta, param, source
Недопустимо для авторов: basefont, bgsound, frame, spacer, wbr
Помимо немногих новинок в HTML5, это должно дать вам представление о тех, которые могут поддерживаться при работе с XHTML как text/html. (Просто проверьте их, изучив DOM.)
Что касается XHTML, который используется как application/xhtml+xml (что делает его XML), применяются правила XML, и любой элемент может быть пустым (даже если DTD XHTML не может выразить это).
Я не собираюсь переусердствовать в этом, тем более что большинство страниц, которые я пишу, либо сгенерированы, либо у тега есть содержание. Единственные два, которые когда-либо доставляли мне неприятности, когда они закрывались самостоятельно:
<title/>
Для этого я просто прибегаю к тому, чтобы всегда давать ему отдельный закрывающий тег, так как, как только он появится в <head></head>
это действительно не делает ваш код более сложным для работы в любом случае.
<script/>
Это самая большая проблема, с которой я совсем недавно столкнулся. В течение многих лет я всегда использовал самозакрытие <script/>
теги, когда скрипт поступает из внешнего источника. Но я совсем недавно начал получать сообщения об ошибках JavaScript о нулевой форме. После нескольких дней исследований я обнаружил, что проблема была (предположительно) в том, что браузер никогда не доходил до <form>
тег, потому что он не понимал, что это был конец <script/>
тег. Поэтому, когда я сделал это в отдельный <script></script>
теги, все работало. Почему разные на разных страницах, которые я сделал в одном браузере, я не знаю, но найти решение было большим облегчением!
Другой проблемой самозакрывающегося тега для IE является элемент title. Когда IE (только что попробовал в IE7) видит это, он представляет пользователю пустую страницу. Однако вы "просматриваете источник", и все есть.
<title/>
Первоначально я видел это, когда мой XSLT генерировал самозакрывающийся тег.