Является ли запись закрывающих тегов для элементов, которые не являются традиционно пустой плохой практикой?

Я заметил, что jQuery (или Firefox) превратит некоторые из моих <span class="presentational"></span> into <span class="presentational" />

Теперь мой вопрос: хорошо ли написать мою разметку? Будут ли какие-то браузеры задыхаться?

Лично я считаю, что выглядит более чистым <span class="presentational" />, если он будет пустым.

Ответ 1

Я предполагаю, что ваш вопрос связан с красной конечной косой чертой на самозакрывающихся элементах при просмотре источника в Firefox. Если это так, вы наткнулись на один из самых яростных, но одновременно пассивных агрессивных дебатов в браузерах против веб-разработчиков войн. XHTML - это не просто разметка документа. Это также о том, как документы предназначены для обслуживания через Интернет.

Прежде чем начать; Я стараюсь не принимать участие здесь.

В спецификации XHTML 1.1 говорится, что веб-сервер должен обслуживать XHTML с помощью Content-Type of application/xhtml + xml. Firefox выделяет эти трейлинг-косые черты как недействительные, потому что ваш документ обрабатывается как text/html, а не application/xhtml + xml. Возьмите эти два примера; идентичная разметка, одна - как application/xhtml + xml, другая - текст /html.

http://alanstorm.com/testbed/xhtml-as-html.php

http://alanstorm.com/testbed/xhtml-as-xhtml.php

Firefox помечает конечную косую черту в метатеге как недопустимую для документа, поданного с текстом /html, и действителен для документа, поданного с приложением /xhtml + xml.

Почему это противоречиво

Для разработчика браузера точка XHTML заключается в том, что вы можете обрабатывать свой документ как XML, а это означает, что если кто-то отправит вам что-то недействительное, спецификация говорит, что вам не нужно его разбирать. Итак, если документ используется как application/xhtml + xml и имеет не-правильно сформированный контент, разработчику разрешено говорить "не моя проблема". Вы можете видеть, что в действии здесь

http://alanstorm.com/testbed/xhtml-not-valid.php

Когда документ используется как text/html, Firefox рассматривает его как простой старый HTML-документ и использует прощание, исправляет его для вас, выполняет процедуры разбора

http://alanstorm.com/testbed/xhtml-not-valid-as-html.php

Итак, для браузера, XHTML, который использовался как text/html, нелепо, потому что он никогда не рассматривался как XML с помощью механизма рендеринга браузера.

Несколько лет назад веб-разработчики, которые хотели быть больше, чем тег-обезьяны (Disclaimer: я включаю себя как один из них), начали искать способы разработки лучших практик, которые не включали трижды вложенные таблицы, но все же позволяли убедительный опыт проектирования. Они/Мы зафиксировали на XHTML/CSS, потому что W3C сказал, что это было будущее, и единственным другим выбором был мир, в котором один поставщик (Microsoft) контролировал спецификацию defacto markup. Настоящим злом является единственный поставщик, и не столько Microsoft. Клянусь.

Итак, где споры? Есть две проблемы с application/xhtml + xml. Первый - Internet Explorer. Там есть устаревшая ошибка/функция в IE, где содержимое, используемое как application/xhtml + xml, предложит пользователю загрузить документ. Если вы попытались посетить xhtml-as-xhtml.php, перечисленные выше, с IE, вероятно, что произошло. Это означает, что если вы хотите использовать application/xhtml + xml, вы должны браунировать sniff для IE, проверить заголовок Accepts и только обслуживать application/xhtml + xml для тех браузеров, которые его принимают. Это не так тривиально, как кажется, чтобы получить право, а также пошел против принципа "написать один раз", к которому стремились веб-разработчики.

Вторая проблема заключается в жесткости XML. Это, опять же, одна из тех проблем, связанных с пламенем, но некоторые люди, которые считают, что один плохой тег или один символ неправильно закодированы, не должны приводить к тому, что пользователь не видит документ, который они хотят. Другими словами, да, спецификация говорит, что вы должны прекратить обработку XML, если он не сформирован, но пользователь не заботится о спецификации, они заботятся о том, что сайт их кошек сломан.

Добавление еще большего количества бензина в проблему заключается в том, что спецификация XHTML 1.0 (не 1.1) говорит о том, что документы XHTML могут обрабатываться как text/html, предполагая определенную совместимость руководящие принципы. Такие вещи, как тег img, который сам закрывается и тому подобное. Ключевое слово здесь может быть. В RFC говорить, может означать необязательный. Firefox выбрал НЕ обрабатывать документы, обслуживаемые с помощью типа XHTML, но тип контента text/html как XHTML. Однако валидатор W3C будет с радостью сообщать об этом документам.

Я оставлю читателя задуматься об одновременном изумлении/ужасе культуры, которая пишет документ, чтобы определить, что они подразумевают под словом.

Перемещение вперед

Наконец, это то, что все HTML 5предмет примерно. XHTML стал таким политическим горячим картофелем, что куча людей, которые хотели перевести язык вперед, решила пойти в другом направлении. Они выпустили спецификацию для HTML 5. В настоящее время она хешируется в W3C и ожидается, что она закончится в следующем десятилетии. В то же время поставщики браузеров выбирают и выбирают функции из разрабатываемой спецификации и реализуют их.

Обновления из комментариев

В комментариях Alex указывает, что если вы собираетесь что-то нюхать, вы должны проверить заголовок Accept, чтобы узнать, применяется ли application/xhtml + xml принимается пользовательским агентом.

Это абсолютно правильно. В общем, если вы собираетесь нюхать, нюхайте эту функцию, а не браузер.

Ответ 2

В дополнение к другим ответам: в IE с элементами, такими как <span /> в вашей разметке , будут возникать всевозможные проблемы с методами обхода DOM в JavaScript. Взгляните на следующий документ XHTML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Test</title>
    <script type="text/javascript">
        function show() {
            var span = document.getElementById("span");
            alert(span.innerHTML);
        }
    </script>
</head>
<body onload="show();">
<p id="p1">Paragraph containing some text followed by
           an empty span<span id="span"/></p>
<p id="p2">Second paragraph just containing text</p>
</body>
</html>

Идея заключается в том, что когда страница загружается, JavaScript будет получать ссылку на пустой диапазон и отображать его содержимое HTML. Это будет пустая строка, не так ли? Не в IE это не будет. В IE вы получаете весь контент после диапазона во всем документе:

</P>
<P id=p2>Second paragraph just containing text</P>

Кроме того, второй <p> отображается в коллекции span childNodes. Тот же <p> также находится в теле childNodes коллекции, то есть a node может эффективно иметь несколько родителей. Это не очень хорошая новость для скриптов, которые полагаются на обход DOM.

Я также писал об этом.

Ответ 3

Да. Это. Это может вызвать проблемы в некоторых случаях для старых браузеров.

<script type='text/javascript' src='script.js' />

В этом случае старый браузер может не понимать, что тег <script> закончился.

Ответ 4

Работает как application/xhtml + xml, < span/ > означает создание элемента span без содержимого.

Используется как text/html, < span/" > означает создание элемента span, в котором содержимое элемента следует за этим тегом до </span> тег встречается, или встречается другой тег (или EOF), который неявно закрывает элемент. то есть в этом случае < span/ > означает то же самое, что <span> .

Помимо этого: HTML 5 определяет как сериализацию HTML и XHTML, так и не влияет на эту проблему так или иначе. Это требует, например, XHTML 1.1, что XHTML будет использоваться как application/xhtml + xml, в отличие от XHTML 1.0. По сути, это ничего не меняет, поскольку все браузеры рассматривают любую версию XHTML, которая используется как text/html как суп-суп.

Ответ 5

См. примечание к теме в рабочей группе XHMTL: http://www.w3.org/TR/xhtml-media-types/

Короче - это прекрасно, если ваш XHTML будет рассматриваться как XHTML. Если вы собираетесь притворяться, что это HTML (который вам нужно сделать, если вы хотите, чтобы он был загружен Internet Explorer (включая версию 8, последний на момент написания), вам нужно перепрыгнуть через обручи).

Обручи достаточно раздражают, что я рекомендую большинству людей придерживаться HTML 4.01.

Ответ 6

Также стоит отметить, что объявление <?xml ...?> до того, как doctype выдает IE в режим quirks.

Ответ 7

Как правило, это не проблема использования сокращения для пустых элементов, но есть некоторые исключения, в которых это может вызвать проблемы.

<script> является важным, который необходимо закрыть с помощью </script>, чтобы избежать проблем.

Другим является <meta>, который работает намного лучше с пауками, написанными как <meta></meta> вместо <meta />

Не совсем вопрос, но связанный, с точки зрения форматирования, версии IE имеют проблемы с только пустыми элементами, такими как <div></div> или <div />. В этом случае для поддержания форматирования требуется <div>&nbsp;</div>.

Ответ 8

Следует четко сказать, что в HTML нет самозакрытых тегов, поэтому, когда браузер решает обработать ваш XHTML как HTML, он не узнает, что тег закрыт. Не проблема для тегов, которые не нужно закрывать в HTML, например <img>, но явно плохо с тегами, например <span>.