Каковы все допустимые самозакрывающиеся элементы (например, <br/>) в XHTML (как это реализовано в основных браузерах)?
Я знаю, что XHTML технически позволяет самозакрывать любой элемент, но я ищу список этих элементов, поддерживаемых всеми основными браузерами. См. В http://dusan.fora.si/blog/self-closing-tags примеры некоторых проблем, вызванных самозакрывающимися элементами, такими как <div />.
Причина, по которой был принят «хромой», «неправильный» ответ, состоит в том, что он отвечал на вопрос, который явно задавал Каменс. Он хотел знать, какие элементы могут быть самозакрывавшимися при обслуживании XHTML как text / html, не вызывая проблем с рендерингом в браузерах. Многие страницы написаны на XHTML и обслуживаются как text / html, даже если это технически некорректно. С помощью этого разъяснения вопрос можно было бы улучшить, но ответ на другой вопрос (что происходит, когда вы выполняете роль application / xml или должны ли отдельные теги в text / html иметь закрытие /) в этом случае не помогает.






<hr /> - еще один
Вы должны взглянуть на xHTML DTD, они все перечислены. Вот краткий обзор всех основных:
<br />
<hr />
<img />
<input />
Исправлена и очищена разметка. Будьте осторожны со ссылками на этих страницах, они медленно загружаются.
<area />
<base />
<basefont />
<br />
<hr />
<input />
<img />
<link />
<meta />
/> : "area", "base", "basefont", "br", "col", "frame", "hr", "img", "input", "link", "meta", "param"Обратите внимание, что W3schools не является аффилированным лицом W3C и даже не отвечает на исправления, отправленные членами W3C.
Как это часто бывает, w3schools почти прав. Точный способ найти пустые элементы - запустить grep EMPTY xhtml1-strict.dtd | sort или grep EMPTY xhtml1-transitional.dtd | sort.
ИМХО, люди слишком сильно бьют W3Schools. Он зарекомендовал себя как отличный ресурс, когда вы НАЧИНАЕТЕ (!) Заниматься темой, о которой ничего не знаете.
А как насчет <meta> и <link>? Почему их нет в этом списке?
Простое практическое правило: не закрывайте самостоятельно любой элемент, который должен содержать контент, потому что это определенно вызовет проблемы с браузером рано или поздно.
Те, которые автоматически закрываются, такие как <br> и <img>, должны быть очевидны. Те, которые не ... просто не закрывайте их сами!
Одним из элементов, с которым следует быть очень осторожным в этой теме, является элемент <script>. Если у вас есть внешний исходный файл, он БУДЕТ вызывать проблемы, когда вы его закрываете. Попытайся:
<!-- this will not consistently work in all browsers! -->
<script type = "text/javascript" src = "external.js" />
Это будет работать в Firefox, но не работает, по крайней мере, в IE6. Я знаю, потому что столкнулся с этим, когда слишком рьяно закрывал каждый элемент, который видел ;-)
Затрагивает все версии MSIE: webbugtrack.blogspot.com/2007/08/…
<script> не закрывается автоматически в Firefox 3.
Ну, когда я столкнулся с этим, раньше это работало в Firefox. Похоже, он больше не работает ни в одном браузере. Может также работать только в режиме причуд?
@erickson он отлично работает в Firefox, если ты правильно определит ваш тип MIME.
WebKit продолжает делать это по соображениям совместимости.
Еще одна проблема с самозакрывающимся тегом IE - это элемент заголовка. Когда IE (только что попробовал в IE7) видит это, он представляет пользователю пустую страницу. Однако вы "просматриваете источник", и все там.
<title/>
Я впервые увидел это, когда мой XSLT сгенерировал самозакрывающийся тег.
Chromium тоже не любит теги <title/>.
Каждый браузер, поддерживающий XHTML (Firefox, Opera, Safari, IE9), поддерживает самозакрывающийся синтаксис на каждый элемент.
<div/>, <script/>, <br></br> все должно работать нормально. Если они этого не делают, то у вас есть HTML с неправильно добавленным XHTML DOCTYPE.
DOCTYPE не меняет способ интерпретации документа. Только MIME-тип делает.
Решение W3C об игнорировании DOCTYPE:
The HTML WG has discussed this issue: the intention was to allow old (HTML-only) browsers to accept XHTML 1.0 documents by following the guidelines, and serving them as text/html. Therefore, documents served as text/html should be treated as HTML and not as XHTML.
Это очень распространенная ошибка, потому что W3C Validator в значительной степени игнорирует это правило, но браузеры неукоснительно следуют ему. Читать Понимание HTML, XML и XHTML из блога WebKit:
In fact, the vast majority of supposedly XHTML documents on the internet are served as
text/html. Which means they are not XHTML at all, but actually invalid HTML that’s getting by on the error handling of HTML parsers. All those “Valid XHTML 1.0!” links on the web are really saying “Invalid 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 vs 2). Если вы не можете верить своим глазам (или не знаете, как устанавливать типы MIME), откройте свою страницу через Прокси-сервер XHTML.
Другой способ проверить - просмотреть исходный код в Firefox. Он будет выделять косые черты красным цветом, если они недопустимы.
В HTML5 / XHTML5 это не изменилось, и различие стало еще более четким, потому что у вас даже нет дополнительного DOCTYPE. Content-Type - король.
Для записи, спецификация XHTML позволяет любому элементу быть самозакрывающимся, сделав XHTML XML-приложение: [курсив мой]
Empty-element tags may be used for any element which has no content, whether or not it is declared using the keyword EMPTY.
Это также явно показано в Спецификация XHTML:
Empty elements must either have an end tag or the start tag must end with
/>. For instance,<br/>or<hr></hr>
Неправильный afaik, потому что использование самозакрывающихся версий <script> или <div> приводит к разному рендерингу / интерпретации.
@ZeissS Только в text/html. В реальном XHTML, отправленном как application/xhtml+xml, он работает нормально. Пожалуйста, прочтите статью, на которую я ссылаюсь (или приложение C спецификации XHTML), прежде чем голосовать против.
@porneL, можешь ли ты уточнить в терминах (X) HTML5? Какие отличия от современных браузеров, поддерживающих такую разметку, следует учитывать?
@pornel, можете ли вы гарантировать, что самозакрывающиеся теги <script /> будут работать в старых браузерах? Я так не думаю. Вы говорите авторитетно, и большая часть вашей информации точна, но опыт подсказывает мне, что самозакрывающиеся теги скрипта будут проблематичными, и лучше всего полностью избегать их, чем вызывать у себя головную боль.
@Metagrapher, если старые браузеры не поддерживают настоящий XHTML, ИЛИ вы не можете установить тип MIME, это не сработает. Однако в браузерах с поддержкой XHTML (на данный момент все основные) с типом application/xhtml+xml MIME я могу гарантировать, что <script/> будет работать. С типом MIME. Только.
IE9 может «поддерживать» это, но попробуйте сделать <label id = 'x' /> поверх группы переключателей и посмотрите, как это НЕ ИСПОЛЬЗУЕТСЯ !!!
@capdragon: <label/> отлично работает в IE9 - с правильным типом MIME. В цитируемой вами статье не упоминается используемый тип MIME, поэтому я предполагаю, что им (и вам) нужно очень внимательно прочитать мой ответ.
@porneL: Это не решение, потому что мне нужно поддерживать старые браузеры.
@capdragon: старые браузеры не поддерживают XHTML (используется как application / xhtml + xml). Если вы отправите им документ XHTML как «text / html», тогда XHTML будет отображаться как суп тегов (т.е. браузер анализирует его как HTML и учитывает ошибки самозакрывающихся тегов, которые он изящно исправляет). Ваши варианты: 1. написать HTML 4 (не совсем вариант при использовании ASP.NET, который отображает XHTML), 2. обслуживать ваш XHTML как 'application / xhtml + xml' (требуется IE9 +, и этот тип MIME нарушит скрипты во всех браузерах. в любом случае, так что def не вариант), 3. напишите HTML 5, что в основном делает суп из тегов стандартом :)
Чтобы повторить это ... XHTML должен обслуживаться как 'application / xhtml + xml', но он полностью сломан во всех современных браузерах, включая IE9, потому что такие элементы, как 'document.write' и 'document.cookie' не существуют, а многие скрипты сломаются, даже если в остальном страница отображается нормально. ПОЭТОМУ, вам лучше придерживаться обслуживания контента с типом MIME 'text / html' и лучше всего придерживаться рекомендаций HTML 5, потому что стандарт HTML 5 был разработан, чтобы охватить суп тегов (некоторая смесь HTML и XHTML) в четко очерченная усадьба (о чем свидетельствует слияние XHTML2 WG с HTML5).
<a> не закрывается автоматически в Chrome 18, Firefox 11, Safari 5.1 или Opera 11 с типом документа XHTML 1.1 или HTML 5 (не проверял IE).
@SlippDouglas, это правильно, пожалуйста, прочтите внимательно, почему DOCTYPE не имеет значения. Он самозакрывается во всех этих браузерах, когда вы используете XHTML / HTML5 + XML правильно.
Ах ... теперь я понимаю. Спасибо, @porneL. Я даже не знал о существовании HTML5 + XML, просто простой HTML5. Думаю, этот вопрос действительно устарел.
Это абсолютно увлекательно - что действительно удивительно, так это то, что домашняя страница w3c объявляет тип документа xhtml, но тип mime text / html в заголовке. Судя по тому, что вы говорите, я думаю, это очень неверно.
Этот вопрос, получивший большое количество голосов, кажется неправильным? Согласно спецификации W3C, никакие элементы, которые могут содержать контент, не могут быть самозакрывающимися в XHTML. Кроме того, если вы сами закрываете div, он даже не отображается должным образом в большинстве современных браузеров (например, <div style = 'clear: both;' /> не работает). Я что-то пропустил?
@NickG да, вам не хватает настройки правильного HTTP-заголовка Content-Type, и ваш XHTML в конечном итоге анализируется как недопустимый HTML. Пожалуйста внимательно прочтите все страницы, на которые я дал ссылки, которые точно объясняют, почему казаться не работает на вас. Спецификация XHTML запрещает / требует, чтобы некоторые элементы имели контент, но это ортогонально синтаксису XML, который он использует, и синтаксическая разница полностью исчезает на уровне DOM (если анализируется в соответствующем режиме, настраивается только через XML Content-Type).
@porneL Но независимо от того, что физически работает обозреватель, самозакрывающиеся div недействительны в соответствии со спецификацией W3C, поскольку они могут содержать контент. См .: stackoverflow.com/questions/7971716/… Насколько я могу судить, ваш ответ неверен, поскольку спрашивающий спрашивает, что действительно, а не то, что можно заставить работать.
@porneL Связанный ответ все еще действителен. XHTML НЕ допускает самозакрывающихся div ни при каких обстоятельствах. См .: w3.org/TR/xhtml-media-types/#C_2 В нем говорится: «Если элемент разрешает содержимое (например, элемент div), но экземпляр этого элемента не имеет содержимого (например, пустой раздел), НЕ используйте« минимизированный »синтаксис тега (например, <div / >) ".
@NickG 1. Документ, на который вы ссылаетесь, является Примечание W3C, что означает, что не удалось становится Рекомендацией. 2. Это не спецификация, описывающая, что допустимо, это просто предложение, что делать, чтобы обойти отсутствие поддержки XHTML в старых браузерах.
«Все эти« Valid XHTML 1.0! » ссылки в Интернете действительно говорят: «Неверный HTML 4.01!» --- Это неверно или, по крайней мере, очень неточно. См. w3.org/TR/xhtml1. XHTML 1.0 явно разрешил обслуживание документов как тип мультимедиа text / html, в то время как XHTML 1.1 принудительно применяет application / xhtml + xml, поэтому было невозможно обслуживать последнее, например, в IE6.
Самозакрывающийся синтаксис работает со всеми элементами в application / xhtml + xml. Он не поддерживается ни в одном элементе в text / html, но элементы, которые являются «пустыми» в HTML4 или «void» в HTML5, в любом случае не принимают закрывающий тег, поэтому, если вы поместите на них косую черту, это будет выглядеть так, как если бы поддерживался самозакрывающийся синтаксис.
В последний раз, когда я проверял, следующие элементы были пустыми / пустыми, перечисленными в HTML5.
Действительно для авторов: area, base, br, col, command, embed, eventource, hr, img, input, link, meta, param, source
Недопустимо для авторов: basefont, bgsound, frame, spacer, wbr
Помимо тех немногих, что являются новыми в HTML5, это должно дать вам представление о тех, которые могут поддерживаться при обслуживании XHTML как text / html. (Просто проверьте их, изучив созданный DOM.)
Что касается XHTML, который используется как application / xhtml + xml (что делает его XML), применяются правила XML, и любой элемент может быть пустым (даже если XHTML DTD не может выразить это).
Надеюсь, это кому-то поможет:
<base />
<basefont />
<frame />
<link />
<meta />
<area />
<br />
<col />
<hr />
<img />
<input />
<param />
Я не собираюсь переоценивать это, тем более что большинство страниц, которые я пишу, либо сгенерированы, либо у тега есть контент. Единственные два, которые когда-либо вызывали у меня проблемы при их самозакрывании:
<title/>
Для этого я просто прибегал к тому, чтобы всегда давать ему отдельный закрывающий тег, поскольку, как только он появляется в <head></head>, он в любом случае не делает ваш код более беспорядочным для работы.
<script/>
Это большая проблема, с которой я совсем недавно столкнулся с проблемами. В течение многих лет я всегда использовал самозакрывающиеся теги <script/>, когда сценарий исходит из внешнего источника. Но совсем недавно я начал получать сообщения об ошибках JavaScript о пустой форме. После нескольких дней исследований я обнаружил, что проблема заключалась (предположительно) в том, что браузер никогда не доходил до тега <form>, потому что не понимал, что это конец тега <script/>. Так что когда я сделал это в отдельные теги <script></script>, все заработало. Я не знаю, почему на разных страницах, сделанных в одном браузере, разные страницы, но найти решение было большим облегчением!
Лучше задать вопрос: какие теги можно закрывать самостоятельно даже в режиме HTML, не затрагивая код? Ответ: только те, у которых есть пустой контент (недействительны). Согласно Спецификации HTML следующие элементы недействительны:
area, base, br, col, embed, hr, img, input, keygen, link, menuitem, meta, param, source, track, wbr
В более старой версии спецификации также указан command.
Кроме того, по разным источникам недействительны следующие устаревшие или нестандартные теги:
basefont, bgsound, frame, isindex
В HTML 5 они называются «пустыми» элементами. Они перечислены в официальная спецификация W3.
A void element is an element whose content model never allows it to have contents under any circumstances.
По состоянию на апрель 2013 года это:
area, base, br, col, command, embed, hr, img, input, keygen, link, meta, param, source, track, wbr
По состоянию на декабрь 2018 г. (HTML 5.2) это:
area, base, br, col, embed, hr, img, input, link, meta, param, source, track, wbr
Разве это не по умолчанию одна из целей XHTML? Я думал, что одним из преимуществ XHTML является то, что вы можете использовать генератор XML для генерации HTML. Почему любой XML-генератор должен знать, какие теги могут быть самозакрывающимися? Слишком странно.