Чи справедливі (недійсні) теги, що самозакриваються, в HTML5?


669

W3C валідатор не любить самозакриваються тег (ті , які закінчуються " />«) на непорожньої елементах. (Пустотні елементи - це ті, які можуть ніколи не містити жодного вмісту.) Чи все ще вони дійсні в HTML5?

Деякі приклади прийнятих недійсних елементів:

<br />
<img src="" />
<input type="text" name="username" />

Деякі приклади відхилених недійсних елементів:

<div id="myDiv" />
<span id="mySpan" />
<textarea id="someTextMessage" />

Примітка: валідатор W3C насправді приймає недійсні теги самозамикання: у автора спочатку виникла проблема через простий друк (\>замість/>); однак теги, що самозакриваються, в HTML5 взагалі не відповідають дійсності, а відповіді пояснюють проблему самозакриваються тегів у різних смаках HTML.


2
@Ben: о, вибач, я думаю, ти маєш рацію. У цьому випадку я неправильно зрозумів початкове запитання, я вважав, що ОП хоче знати, чи дійсні теги самозакриття взагалі дійсні в HTML5. Але це означає, що він просто робив помилки в своєму коді, або він не знав, як правильно записати теги, що закриваються, що має сенс, що валідатор W3C позначив його код недійсним.
Sk8erPeter

16
Щоб заощадити час для майбутніх читачів: так, синтаксис у питанні невірний, і ні, ви не повинні змінювати його. ОП чітко і виправдано пояснила, чому . Оскільки це призвело до помилок перевірки, які викликали це питання, синтаксис не слід виправляти.
Jordan Grey

2
Ви все ще воюєте, в якому напрямку повинні бути спрямовані коси? Давай.
BoltClock

3
@BoltClock Yup, все ще воює. Хлопці: якщо про це питання задавали \>, його слід закрити як марне запитання з виправленням. Відповіді на всі адреси />. />Версія є корисним. Нехай так буде.
Жиль "ТАК - перестань бути злим"

1
Тоді питання потрібно переробити, оскільки валідатор W3C насправді приймає теги, що закриваються. Важко переформулювати це питання таким чином, не порушуючи його цілісності щодо початкового наміру. Тому, якщо ми хочемо дотримуватися правил ТА, нам, можливо, доведеться пожертвувати ясністю в таких питаннях, як це, хоча здається, що редагування питання є єдиним розумним, що потрібно зробити, задля більшої користі середній. Ми можемо розпочати ще одне обговорення мета, якщо є багато інших питань, подібних.
оса

Відповіді:


1238
  • В HTML 4 , <foo /(так, з не >зовсім) коштів <foo>(що призводить до <br />означаючи <br>>(тобто <br>&gt;) , і це <title/hello/означає <title>hello</title>). Це правило SGML, що браузери виконували дуже погану роботу з підтримки, а специфікація радить авторам уникати синтаксису .

  • У XHTML , <foo />значить<foo></foo> . Це правило XML, яке застосовується до всіх документів XML. Однак, XHTML часто подається як text/htmlбраузер, який (принаймні історично) обробляється браузерами, використовуючи інший аналізатор, ніж документи, що подаються application/xhtml+xml. W3C надає рекомендації щодо сумісності, які слід дотримуватися для XHTML як text/html. (По суті: використовуйте синтаксис тегів, що закриваються, лише коли елемент визначений як EMPTY (а кінцевий тег був заборонений у специфікації HTML)).

  • У HTML5 значення значення <foo /> залежить від типу елемента .

    • У елементах HTML, які позначені як недійсні елементи (по суті "Елемент, який існував до HTML5 і якому було заборонено мати будь-який вміст"), кінцеві теги просто заборонені. Нахил в кінці стартового тегу дозволений, але не має значення. Це просто синтаксичний цукор для людей (і підкреслювачів синтаксису), які залежать від XML.
    • На інших елементах HTML косою рисою є помилка, але відновлення помилок призведе до того, що браузери ігнорують її і трактуватимуть тег як звичайний стартовий тег. Зазвичай, в кінцевому підсумку пропущений кінцевий тег призводить до того, що наступні елементи стануть дітьми замість братів та сестер.
    • Іноземні елементи (імпортовані з XML-програм, таких як SVG) трактують це як синтаксис, що закривається.

24
" ... які залежать від XML. " Здається, ви припускаєте, що відповідність XML погана. Тим не менш, кінцевим результатом у HTML5 здається, що нам все одно доводиться мати справу з кутовими дужками (тобто з більшою кількістю незручностей XML), в той час як це ускладнює використання інструментів на основі XML (наприклад, інструментів шаблонів або різних процесорів ). Навіть з покоління погляду, здавалося б, це <object data="..." />і <img src="..."></src>не в порядку, поки <object data="..."></object>і <img src="..." />є, що ускладнює консистенцію інструменту. Це виглядає як ситуація, що втрачає програш.
Бруно

7
@Bruno - HTML передує XML. Намагання змусити людей перейти на XHTML не вдалося. З text/htmlвеб-переглядачами веб-переглядачі не надають особливого значення косої рисі, тому в тому числі це не виконує ніяких практичних цілей. Це тільки для того, щоб він виглядав як XML для людей, які не можуть вийти зі звички.
Квентін

6
@Quentin Я зовсім не згоден. Мені просто прикро, що дійсний еквівалент XML не обов'язково є дійсним HTML5 (наприклад, <img ...></img>замість <img ...>або <img ... />). Оскільки HTML5 в цілому менш суворий (можливо, чому XHTML не вдався), він міг би допустити щось подібне <img ...></img>. На жаль, це не так, тому генератору шаблонів на основі XML потрібно знати, як розрізнити виробництво недійсних елементів або самозакриваються елементів: ви навіть не можете мати одне правило, щоб сказати, як написати всі порожні елементи як <tag></tag>.
Бруно

3
XHTML не вдався до того, як HTML 5 був навіть на горизонті, і ви не можете мати довгі порожні елементи, оскільки виправлення помилок у браузері, що передувало XHTML, зробило б такі дії, як трактування, </br>оскільки <br>це <br></br>було б розривом подвійної лінії. (і зворотна сумісність із поганою розміткою в реальному світі (як </br>) є однією з цілей дизайну HTML 5).
Квентін

1
FROM W3C: Пустотні елементи: область, база, br, col, embed, hr, img, input, keygen, link, meta, param, source, track, wbr "Елементи пустоти мають лише тег старту; кінцеві теги не повинні бути вказані для недійсних елементів. " w3.org/TR/html5/syntax.html#void-elements
Фабіо Ноласко,

406

Як наголосив Микита Скворцов, діло, що закривається, не підтверджується. Це тому, що div - це нормальний елемент , а не недійсний елемент .

Відповідно до специфікації HTML5 , теги, які не можуть містити вмісту (відомі як недійсні елементи ), можуть самозакриватися *. Сюди входять такі теги:

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

Однак "/" є абсолютно необов'язковим для вищезазначених тегів, тому <img/>не відрізняється від <img>, але <img></img>є недійсним.

* Примітка: сторонні елементи також можуть бути самозакритими, але я не думаю, що це відповідає цій відповіді.


1
Інструменти для розробників IE10 дають мені "HTML1500: Тег не може бути самозакритим. Використовуйте явний тег закриття." у рядку <meta charset = "UTF-8" /> Будь-яка ідея, чому це було б?
Джеймс в Інді

Гаразд, я з'ясував, що теги, що самозакриваються, не повинні мати косу рису (і видалення її виправляє мою помилку). Cite: tiffanybbrown.com/2011/03/23/…
Джеймс в Інді

Специфікація змінилася. Тепер елементи "недійсні" або "самозакриваються" не повинні включати косу рису, коли вона використовується як HTML 5. Однак, якщо він подається як XHTML, може знадобитися косою рисою закриття (перевірте документи в цьому випадку). При практичному використанні сторінки зазвичай відображатимуться, як очікувалося, навіть якщо закриття /було включено, але це не гарантується (це залежить від того, що браузер ефективно перепише код для вас та інтерпретує його так, як ви задумали.) Також, якщо чомусь потрібна ваша сторінка для проходження перевірки HTML 5, вона може не пройти, якщо ви закриєте теги для недійсних елементів.
SherylHohman

Щодо коментаря @ SherylHohman, я не вірю, що специфікація змінилася (або якщо вона є, вона змінилася назад). Див. W3.org/TR/html5/syntax.html#start-tags (8.1.2.1.6) - недійсні (або сторонні) елементи все ще можуть включати косу рису.
ChrisC

63

На практиці використання тегів, що закриваються у HTML, має працювати так, як ви очікували. Але якщо ви стурбовані написанням дійсного HTML5, ви повинні зрозуміти, як поводиться використання таких тегів у двох різних двох синтаксичних формах, які ви можете використовувати. HTML5 визначає як синтаксис HTML, так і синтаксис XHTML, які схожі, але не тотожні. Який з них використовується, залежить від типу медіа, надісланого веб-сервером.

Більш ніж ймовірно, ваші сторінки подаються як такі text/html, що випливає з більш м'яким синтаксисом HTML. У цих випадках HTML5 дозволяє певним початковим тегам мати необов'язковий / до його завершення>. У цих випадках / НЕ є обов'язковим і ігнорується, так <hr>і <hr />ідентичні. Специфікація HTML називає ці "недійсні елементи" та дає список дійсних. Власне кажучи, необов'язковий / дійсний лише в початкових тегах цих пустотних елементів; наприклад, <br />і <hr />є дійсним HTML5, але <p />це не так.

Специфікація HTML5 чітко розрізняє те, що є правильним для авторів HTML та розробників веб-браузерів, при цьому для другої групи потрібно прийняти всі види недійсного синтаксису "застарілого". У цьому випадку це означає, що браузери, сумісні з HTML5, прийматимуть незаконні самозакриті теги, як-от <p />, та надаватимуть їх так, як ви, напевно, очікуєте. Але для автора ця сторінка не буде дійсною HTML5. (Що ще важливіше, дерево DOM, яке ви отримуєте від використання цього виду незаконного синтаксису, може бути серйозно зірвано; самозакриті <span />теги, наприклад, як правило, сильно псують речі ).

(У незвичайному випадку, коли ваш сервер знає, як надсилати XHTML-файли як тип XML MIME, сторінка повинна відповідати синтаксису XHTML DTD і XML. Це означає, що для тих елементів, визначених як такі , потрібні самозакриваються теги .)


31
<p /> буде розглядатися як відкриваючий тег, а не тег, що закривається. Це означає, що весь залишок документа буде розглядатися як такий, що знаходиться в складі елемента P. Я, напевно, не очікую цього, і створить серйозний безлад на будь-якій нетривіальній сторінці.
mhsmith

12

HTML5 в основному поводиться так, ніби продільної косої риски немає. У синтаксисі HTML5 немає теги, що самозакривається.

  • Теги, що самозакриваються, на таких недійсних елементах <p/>, <div/>взагалі не працюватимуть. Косою косою рисою буде проігноровано, і вони будуть розглядатися як відкриваючі теги. Це, ймовірно, може призвести до проблем з гніздуванням.

    Це справедливо незалежно від того, чи є пробіл перед косою рисою: <p />і <div />також не працюватиме з тієї ж причини.

  • Теги, що самозакриваються на елементах недійсних, начебто <br/>чи <img src="" alt=""/> будуть працювати, але лише тому, що проділ косої риски ігнорується, і в цьому випадку це призводить до правильної поведінки.

У результаті все, що працювало у вашій старій "XHTML 1.0, що служило текстом / html", буде продовжувати працювати так само, як і раніше: останчі косої риси на недійсних тегах там також не приймалися, тоді як косовий косий рядок на недійсних елементах працював.

Ще одна примітка: можна представити документ HTML5 як XML, і це іноді називається "XHTML 5.0". У цьому випадку застосовуються правила XML і теги, що завжди закриваються, завжди обробляються. Завжди потрібно обслуговувати XML-тип mime.


4

Теги самозакривання дійсні в HTML5, але не обов'язкові.

<br>і <br />вони чудово.


12
Відповідно до специфікації HTML5, синтаксис ( />), що закривається ( ), не може використовуватися для недійсного елемента HTML.
naXa

2
Питання стосувалося самозакриття тегів на недійсних елементах , як-от <p/>або <div/>.
thomasrutter

2
Спочатку питання було не конкретно про недійсні елементи. Це було більше схоже на те, чи можна все-таки використовувати <... />як у XHTML, чи потрібно видаляти /HTML5. Питання було змінено кілька разів після.
Нік

Так чи інакше, відповідь полягає в тому, що косою рисою буде проігноровано, що порушить елементи, не оголошені недійсними, але будуть сумісні з елементами недійсності.
thomasrutter

4

Я був би дуже обережний із тегами самозакривання, як показує цей приклад:

var a = '<span/><span/>';
var d = document.createElement('div');
d.innerHTML = a
console.log(d.innerHTML) // "<span><span></span></span>"

Моє відчуття кишки було б <span></span><span></span>замість цього


2
Це описано у прийнятій відповіді:On other [than void] HTML elements, the slash is an error, but error recovery will cause browsers to ignore it and treat the tag as a regular start tag. This will usually end up with a missing end tag causing subsequent elements to be children instead of siblings.
Палець

-1

Однак - лише для запису - це недійсно:

<address class="vcard">
  <svg viewBox="0 0 800 400">
    <rect width="800" height="400" fill="#000">
  </svg>
</address>

І коса риса зробить її знову дійсною:

    <rect width="800" height="400" fill="#000"/>

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