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

StackOverflow https://stackoverflow.com/questions/348736

  •  20-08-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

Я предполагаю, что ваш вопрос связан с красной косой чертой на самозакрывающихся элементах при просмотре исходного кода в 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-а-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 только тем браузерам, которые его принимают. Это не так тривиально как это звучит правильно, а также пошло против " write Once " Принцип, к которому стремились веб-разработчики.

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

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

Служит приложением / 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, как суп из тегов.

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top