Які всі дійсні самозакриваються елементи в XHTML (як реалізовано основними браузерами)?


188

Які всі дійсні елементи, що закриваються (наприклад, <br/>) у XHTML (як реалізовано основними браузерами)?

Я знаю, що XHTML технічно дозволяє самостійно закривати будь-який елемент, але я шукаю список тих елементів, які підтримуються всіма основними браузерами. Див. Http://dusan.fora.si/blog/self-closing-tags для прикладів деяких проблем, викликаних самозакриваються елементами, такими як <div />.


7
Чи це не за замовчуванням одна з цілей XHTML? Я подумав, що однією з переваг XHTML було те, що ви можете використовувати генератор XML для створення HTML. Чому будь-якому XML-генератору відомо про те, які теги можуть бути самозакритими? Надто дивно.
Ілля

6
Причина того, що відповідь «кульгава», «неправильна» була прийнята, це тому, що вона відповіла на запитання, яке, очевидно, задавали камени. Він хотів знати, які елементи можуть бути самозакритими, коли обслуговувати XHTML як текст / html, не викликаючи проблем із рендерінгом у браузерах. Дуже багато сторінок написано в XHTML і слугують текстом / html, навіть якщо це технічно неправильно. Питання можна було б покращити за допомогою цього уточнення, але відповідь на інше запитання (що відбувається, коли ви виконуєте функцію application / xml, чи мають окремі теги в тексті / html мати закриття /) в цьому випадку не допомагає.
Нік Локвуд

Відповіді:


180

Кожен браузер, який підтримує XHTML (Firefox, Opera, Safari, IE9 ), підтримує синтаксис, що закривається на кожному елементі .

<div/>, <script/>, <br></br>Все повинно працювати нормально. Якщо цього немає, у вас є HTML з неправильно доданим XHTML DOCTYPE.

DOCTYPE не змінює інтерпретацію документа. Лише тип MIME .

Рішення W3C про ігнорування DOCTYPE :

HTML WG обговорив цю проблему: намір був дозволити старим браузерам (лише для HTML) приймати документи XHTML 1.0, дотримуючись вказівок, і подавати їх як текст / html. Тому документи, що подаються як текст / 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>


7
Неправильно afaik, оскільки використання самозакриваються версій <script>або <div>призводить до різного відображення / інтерпретації.
ZeissS

13
@ZeissS лише в text/html. У реальному XHTML, надісланому, оскільки application/xhtml+xmlвін працює чудово. Будь ласка, прочитайте статтю, до якої я посилаюся (або XHTML-специфікацію Додаток C), перш ніж звертатись на них.
Корнель

3
@pornel Ви можете гарантувати, що теги самозакриття <script /> будуть працювати у старих браузерах? Я не думаю, що так. Ви звучаєте авторитетно, і більша частина вашої інформації є точною, але досвід підказує, що самостійне закриття тегів скриптів буде проблематичним, і краще просто повністю їх уникати, а не задавати собі головний біль.
Метаграф

6
@Metagrapher, якщо старші веб-переглядачі не підтримують справжній XHTML, А якщо ви не встановите тип MIME , він не працюватиме. Однак у підтримуваних XHTML браузерах (усі основні на даний момент) з application/xhtml+xmlтипом MIME я можу гарантувати, що <script/>це спрацює. З типом MIME. Тільки.
Корнель

4
@capdragon: Старіші браузери не підтримують XHTML (служить як "application / xhtml + xml"). Якщо ви надсилаєте їм документ XHTML як "text / html", то XHTML виводиться у вигляді супу з тегами (тобто браузер аналізує його як HTML і розглядає помилки самозакриваються тегів, з яких витончено відновлюється). Ваші варіанти: 1. написати HTML 4 (не зовсім варіант, якщо ви використовуєте ASP.NET, який надає XHTML), 2. обслуговуйте свій XHTML як "application / xhtml + xml" (потрібен IE9 +, і цей тип MIME порушить сценарії у всіх браузерах так чи інакше, так що не є варіантом), 3. напишіть HTML 5, який в принципі робить тег-суп стандартним :)
Тринько

41

Один елемент, з яким слід дуже обережно ставитися до цієї теми, - це <script> елемент. Якщо у вас є файл із зовнішнім джерелом, він буде створювати проблеми, коли ви його самостійно закриєте. Спробуй це:

<!-- this will not consistently work in all browsers! -->
<script type="text/javascript" src="external.js" />

Це буде працювати в Firefox, але в IE6 принаймні перерви. Я знаю, бо я натрапив на це, коли надто завзято самостійно закривав кожен елемент, який я бачив ;-)


Впливає на всі версії MSIE: webbugtrack.blogspot.com/2007/08/…
scunliffe

4
<script> не закривається в Firefox 3.
hsivonen

Що ж, раніше працював у Firefox, коли я стикався з ним. Здається, він більше не працює в жодному браузері. Можливо, також може працювати лише в режимі диваків?
Ерік ван Бракель

1
@erickson це чудово працює у Firefox, якщо ви отримаєте право свого типу MIME.
Корнель

WebKit продовжує робити це з міркувань сумісності.
Юхонг Бао

35

Синтаксис, що самозамикається, працює на всіх елементах у application / xhtml + xml. Він не підтримується жодним елементом у тексті / html, але елементи, які "порожні" в HTML4 або "недійсні" в HTML5, ні в якому разі не беруть кінцевий тег, тому якщо ви ставите косу рису на ті, що здається, ніби синтаксис самозамикання підтримувався.


33

З довідкового сайту W3 Schools :

<area />
<base />
<basefont />
<br />
<hr />
<input />
<img />
<link />
<meta />

7
w3schools.com/tags/default.asp Я бачу 12 тегів, що закінчуються на />:"area", "base", "basefont", "br", "col", "frame", "hr", "img", "input", "link", "meta", "param"
10.10

94
Зауважте, що W3schools не пов'язані з W3C і навіть не відповідають на виправлення, надіслані членами W3C.
Корнель

2
Як це часто, w3schools майже має рацію. grep EMPTY xhtml1-strict.dtd | sortgrep EMPTY xhtml1-transitional.dtd | sort
Точним

1
ІМХО, люди б'ють W3School дуже важко. Це зарекомендувало себе як чудовий ресурс, коли ви починаєте (!) З теми, про яку нічого не знаєте.
Priidu Neemre

28

Краще питання: яке теги можна самозакрити навіть у режимі HTML, не впливаючи на код? Відповідь: лише ті, які мають порожній вміст (недійсні). Відповідно до специфікацій HTML, такі елементи є недійсними:

area, base, br, col, embed, hr, img, input, keygen, link, menuitem, meta, param, source, track, wbr

Також перелічена старіша версія специфікації command. Крім того, згідно з різними джерелами, такі застарілі або нестандартні теги є недійсними:

basefont, bgsound, frame, isindex


10

Сподіваюся, це допоможе комусь:

<base />
<basefont />
<frame />
<link />
<meta />

<area />
<br />
<col />
<hr />
<img />
<input />
<param />

5

Що про <meta>і <link>? Чому вони не в цьому списку?

Швидке правило: не закривайте самостійно жоден елемент, який призначений для вмісту, оскільки це, безумовно, рано чи пізно спричинить проблеми з браузером.

Ті, які природно самозакриваються, як <br>і <img>повинні бути очевидними. Ті, що ні ... просто не закривайте їх самостійно!


4

Востаннє я перевіряв, що в HTML5 були перелічені порожні / недійсні елементи.

Дійсно для авторів: область, база, br, col, команда, embed, джерело подій, hr, img, input, link, meta, param, source

Недійсне для авторів: basefont, bgsound, frame, spacer, wbr

Окрім кількох, що є новими в HTML5, вони повинні дати вам уявлення про ті, які можуть бути підтримані, коли XHTML подається як текст / html. (Просто перевіряйте їх, вивчаючи створений DOM.)

Що стосується XHTML, що використовується як application / xhtml + xml (що робить його XML), застосовуються правила XML, і будь-який елемент може бути порожнім (хоча XHTML DTD не може цього виразити).


4

Ви повинні подивитися xHTML DTD , вони всі перераховані. Ось короткий огляд усіх основних:

<br />
<hr />
<img />
<input />

1
Виправлена ​​та очищена розмітка. Дбайливі посилання на цих сторінках, вони повільно завантажуються.
e-satis

4

Їх називають "недійсними" елементами в HTML 5. Вони перераховані в офіційній специфікації W3 .

Недійсний елемент - це елемент, модель вмісту якого ніколи не дозволяє йому вміст ні за яких обставин.

Станом на квітень 2013 року, це:

область, база, br, col, команда, embed, hr, img, введення, keygen, посилання, мета, парам, джерело, трек, wbr

Станом на грудень 2018 року (HTML 5.2), це:

область, база, br, col, embed, hr, img, введення, посилання, мета, парам, джерело, трек, wbr


2

Ще одна проблема тегів самозакриття для IE - це заголовок. Коли IE (щойно спробував це в IE7) бачить це, він представляє користувачеві порожню сторінку. Однак ви "переглядаєте джерело" і все є.

<title/>

Я спочатку бачив це, коли мій XSLT генерував тег самозакривання.


Хром теж не любить <title/>теги.
uınbɐɥs

2

Я не збираюся надмірно працювати над цим, тим більше, що більшість сторінок, які я пишу, генеруються або тег має вміст. Єдині два, які коли-небудь створювали мені проблеми при самозакритті:

<title/>

З цього приводу я просто вдався завжди надавати йому окремий тег закриття, оскільки колись він там знаходиться в <head></head>ньому, він насправді не змушує ваш код працювати з будь-яким messier.

<script/>

Це той великий, з яким я зовсім недавно зіткнувся з проблемами. Протягом багатьох років я завжди використовував <script/>теги, що закриваються, коли сценарій надходить із зовнішнього джерела. Але я зовсім недавно почав отримувати повідомлення про помилки JavaScript про нульову форму. Після кількох днів досліджень я виявив, що проблема (нібито) в тому, що браузер ніколи не потрапляє до <form>тегу, оскільки не усвідомлює, що це кінець <script/>тегу. Тож коли я склав це в окремі <script></script>теги, все працювало. Чому різні сторінки на різних сторінках я робив в одному браузері, я не знаю, але знайти рішення було великим полегшенням!


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.