Не является ли написание самозакрывающихся тегов для элементов традиционной пустой практикой? - PullRequest
48 голосов
/ 08 декабря 2008

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

Теперь мой вопрос: можно ли писать мою разметку вот так? Любой браузер захлебнется этим?

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

Ответы [ 8 ]

110 голосов
/ 08 декабря 2008

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

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

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

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

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

Firefox помечает косую черту в метатеге как недопустимый для документа, обслуживаемого text / html, и действительный для документа, обслуживаемого application / 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 механизмом рендеринга браузера.

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

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

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

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

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

Движение вперед

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

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

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

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

19 голосов
/ 15 октября 2009

В дополнение к другим ответам: в 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> отображается в коллекции childNodes диапазона. Тот же самый <p> также находится в коллекции childNodes тела, что означает, что узел может эффективно иметь нескольких родителей . Это не очень хорошая новость для сценариев, которые полагаются на обход DOM.

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

10 голосов
/ 08 декабря 2008

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

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

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

3 голосов
/ 09 декабря 2008

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

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

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

2 голосов
/ 03 февраля 2010

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

2 голосов
/ 15 октября 2009

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

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

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

0 голосов
/ 03 августа 2010

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

0 голосов
/ 08 декабря 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...