Одна из самых печальных вещей, которую я замечаю, когда набредаю на русскоязычные веб-разработчицкие сообщества — это полное нежелание разбираться в сути вопросов. Когда что-то у кого-то не получается, он сначала спрашивает это в форуме, где куча самозванных "гуру" начинает ему рассказывать несусветную чушь. Потом, если повезет, кто-нибудь даст ссылку на какую-нибудь более-менее адекватную статью, которая может частично касаться вопроса. Совет же почитать первоисточник (например спецификацию языка) обычно воспринимается как издевательство, потому как по-английски все "свободно разговаривают" только в своих резюме.
Все это приводит к тому, что русское веб-сообщество полно совершенно странных мифов, пугающе противоречащих логике:
- "надо верстать и таблицами, и div'ами"
- "1 em = 16 px"
- "надо писать на XHTML, а не на HTML"
Вот по поводу последнего — сегодняшняя статья.
"Ложки нет"
Во-первых, нужно четко понимать, что чисто технически никакого XHTML в современном вебе не существует. По той простой причине, что самый распространенный браузер, которым пользуются люди, XHTML отображать не умеет. Если IE скормить реальную XHTML-страницу, то он ее покажет как любой другой XML-документ — в виде дерева элементов.
Многие здесь подумают, что я объелся лебеды, и несу чушь, потому что вот же, например — известный сайт, у которого в сурсе сверху недвусмысленно написано, что это XHTML 1.0, и валидатор подтверждает, что так оно и есть. И IE его, разумеется, отображает.
Загвоздка тут в том, что браузеры выясняют тип документа не по DOCTYPE. Вместо этого они смотрят на то, что указано в заголовках HTTP-ответа, с которым пришел документ. А написано там в подавляющем большинстве случаев:
Content-type: text/html
... ну и еще кодировка, возможно. А это значит, что браузер для отображения документа использует HTML-ный парсер. Чтобы браузер начал отображать документ именно по правилам XHTML, нужны две вещи:
- тип должен быть xml'ным:
application/xml
,text/xml
или рекомендуемый именно для XHTML —application/xhtml+xml
- элементы должны принадлежать зарегистрированному для XHTML пространству имен — это вот та штука
xmlns="http://www.w3.org/1999/xhtml"
Если так сделать, то как я уже сказал, IE, у которого специального XHTML-парсера нет, будет просто показывать дерево элементов, а новые браузеры действительно включатся в XHTML-режим.
DOCTYPE
Стоит уточнить, зачем же все таки нужен DOCTYPE. Как я уже писал в статье про валидацию, теоретически, он указывает на отдельный документ — DTD — по которому можно формально проверить синтаксис XHTML. Но стандарт XML позволяет браузерам этого не делать и быть невалидирующими парсерами. Они и не делают. И единственная программа, которая таки использует DTD — это сам валидатор (мне это напоминает негласное требование к москвичам носить с собой паспорт только для того, чтобы милиция могла его наличие проверять :-) ).
Тем не менее, браузеры все-таки используют строчку DOCTYPE. Но исключительно для того, чтобы по совпадению этой строки с некими внутренними шаблонами включать разные режимы обратной совместимости. Например, будет ли IE6 считать размеры боксов по стандарту или в режиме совметимости с IE5, зависит от того, указать ли ему DOCTYPE строгого (X)HTML или нет. А в Gecko-браузерах таких режимов аж три: "загадочный", "как IE" и "стандартный".
Кстати, интересующимся сильно советую почитать свежую статью Тима Брея о том, чем вреден DOCTYPE. Тим Брей, между прочим, один из авторов XML.
А и не нужно
Думаю, я не ошибаюь сильно, считая, что призывы писать только на XHTML основаны исключительно на том, что это модно. Я помню, что многих людей в свое время издевательски (зная ответ) спрашивал, а зачем именно они вставляют слеш ("/") в теги <img/>
и <br/>
и зачем именно они пишут в начале документа DOCTYPE разных вариантов XHTML. Никакого внятного ответа я на свой вопрос не получал.
Потому что на практике использовать настоящий XHTML а) трудно и б) практически незачем.
Напомню, что кардинальное отличие XHTML от HTML состоит в том, что XHTML подчиняется жестким XML'ным правилам well-formed'ности. То есть, если в документе хоть чуть-чуть что-то неправильно, то браузер обязан бросить парсить документ и сообщить пользователю об ошибке.
Такая строгость нужна и удобна, если ваш пользователь — программа. Тогда, чем более просты и строги правила синтаксиса, тем проще она сама.
Но такое поведение не подходит на вебе. Ни одному пользователю не интересно знать, как там где-то ошибся автор страницы или автор его CMS. Они приходят пользоваться, а не отлаживать. А в современном вебе, где документы составляются из кучи разных несвязанных кусочков информации, синатксические ошибки, к сожалению, слишком часты. Что означает, что ваш правильный XHTML-сайт будет слишком много времени неюзабельным. Достаточно, например, просто перенести copy-paste'ом URL'ку из браузера в блог и, если в URL'ке есть амперсанды (&
), то вы получаете сломанный XHTML, который требует, чтобы эти амперсанды были экранированы (&
).
Пугалка
Если все вышенаписанное не убедило вас в бесполезности XHTML и вы вопреки здравому смыслу думаете, что "это все равно правильно", то я хочу вас еще немного попугать. Потому что эти настроения обычно подкрепляются мнением, что "обэксемелить" HTML — задачка все равно простая. Чего там, в общем-то: закрыть все теги, откавычить атрибуты, экранировать амперсанды и вставить слеши в одиночные теги. На самом деле все несколько сложнее. Вот небольшой и неполный список, во что это выливается:
-
Содержимое элементов
<script>
и<style>
нельзя оставлять в том же виде, что и в HTML. Потому что любой значок ">
" тут же все сломает. Если его экранировать через ">
" или заключать в блоки CDATA, то тогда сломаются HTML'ные браузеры, которые таких страстей не ведают и парсят текст, предполагая, что он не экранирован. Кроме того, в XHTML браузер не обязан вообще парсить содержимое комментариев, а скрипты, как известно, часто так экранируются по историческим соображениям.В итоге, чтобы удовлетворить и XHTML, и HTML, вам придется либо использовать такую вот конструкцию, учитывающую все синтаксисы:
<script> <!--//--><![CDATA[//><!-- ... //--><!]]> </script>
Либо выносить скрипты и стили во внешние файлы. *
document.write
в скриптах в XHTML просто не работает. Придется переписать с использованием DOM-функций -
В самих DOM-функциях нужно опустить все названия элементов в нижний регистр. То же для селекторов в стилях. В XHTML регистр букв имеет значение.
-
Также не работают удобные вещи:
document.body
,document.forms
,document.images
... Придется рисовать длинные вызовы вродеdocument.getElementsByTagName('body')[0]
иdocument.getElementById('change_frm')
-
Если вы храните какой-нибудь текст внутри
<input type="hidden" value="...">
, то переводы строк внутри атрибута "value" в XHTML схлопнутся в пробелы. Чтобы этого не было придется их экранировать: "
". -
Фоновый цвет body в XHTML не распространяется автоматически на все окно
Другими словами, в следующий раз, когда вам нужно будет сверстать страницу для веба, отриньте суету и начните ее так:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<title>Страница</title>
<p>Текст
Это совершенно валидный HTML 4.01 strict. А если вам не нужна валидация, то и DOCTYPE можно сократить до минимума, чтобы только браузеры в стандартный режим включались:
<!DOCTYPE html>
<title>Страница</title>
<p>Текст
Смысл все же есть
Есть редкие случаи, когда применение XHTML оправдано и на вебе тоже.
Одна из областей применения — микроформаты (о которых я уже как-то писал). Поскольку они предлагаются как вещи и человекочитаемые, и машиночитаемые одновременно, то строгость XML'а для них уже полезна.
Другая, еще более редкая штука — смешанные документы. XML позволяет в одном и том же документе объединять элементы разных XML-языков (поскольку синтаксис общий). Чаще всего это используется для вставления в XHTML кусков математики на MathML и графики на SVG. Есть известный блог — Musings — который это широко использует.
Однако, наверное самый полезный эффект, который XHTML произвел, лежит отнюдь не в технических аспектах. Эта самая буква "X" сыграла в свое время важную роль, сделав из простого как бы всем известного и скучного HTML новую модную технологию. Не будь XHTML'а, наверное куда меньше людей заинтересовались бы идеями современной верстки CSS'ом, разделением содержимого и оформления и стали бы читать спецификации хотя бы и только для того, чтобы повесить на страницу бесполезную кнопочку валидации. Пусть... Главное — общий эффект :-)
Комментарии: 84
"Достаточно, например, просто перенести copy-paste’ом URL’ку из браузера в блог и, если в URL’ке есть амперсанды (&), то вы получаете сломанный XHTML". Совершенно верно, тому, что ввел пользователь верить нельзя, иначе не только испорченный xhtml можно получить, но и много разных гадостей.
"Такая строгость нужна и удобна, если ваш пользователь — программа." А разве это в 99,999% случаев не так? Единственно что оправдывает xml - это то, что его удобно генерировать и парсить.
Я тут не совсем про пользователей... Страницу может сломать сам автор, если набирает, скажем, текст поста в блоге и копирует URL из соседнего окна браузера.
Нет, ну понятно, что в любом случае это программа :-). Я имею в виду, что одно дело, когда это браузер, который юзеру показывает страницы, а другое - когда это, скажем, поисковик или какой-нибудь другой парсер, который делает какой-то машинный анализ. В первом случае не совсем корректный парсинг имеет смысл.
Отличная статья! Давно пора было поведать миру об этом. Согласен с каждым словом (хотя сам пишу часто на XHTML - люблю порядок страшно! ;-)) )
Движок блога должен проверять и нормализовывать то, что автор напечатал. В конце концов это реализуется элементарно.
Четкой границы между браузером и небраузером на самом деле нет. Вот rss-reader - это что? И почему, например, тот же wordpress создает одновременно отдельно корректный фид и отдельно html-страницы? Не говоря уже о том, что сами эти rss с atom'ом лишние сущности. Если можно упростить жизнь себе и другим используя формат более строгий чем html, то почему бы этого не делать.
Я пишу на чистом XHTML из-за того, что это обеспечивает кроссбраузерную совместимость и существенно облегчает вёрстку сайтов.
Хм... жаль, что я прочитал эту статью: сразу испортилось впечатление об авторе. Могу оспорить каждый аргумент (времени и желания нет)
Непонятно, для чего эта статья.
Понимаю, что иногда хочется понизвергать основы, но ведь это прочитают и те, кто не будет видеть разницы между оправданным и неоправданным применением XHTML, и слепо возьмут на вооружение, будут использовать в качестве аргумента.
Напомнило статью Лебедева об экономии на кавычках, но он вроде бы стебался, здесь я этого не ощущаю.
Честно говоря, ожидаемая реакция :-).
Но это действительно не стеб, это низвергание тех заблуждений, которые укоренились до степени религии, и люди, к моему глубокому сожалению, готовы их рьяно защищать, даже не понимая, для чего. Я с удовольствием выслушаю любое несогласие, и готов с ним поспорить. Ведь в статье я привел чисто технические аргументы (хотя и с хорошей долей язвы :-) ).
Вот, Agat, например:
Верстку облегчает разделение контента и стиля, а чем верстать контент - c X или без, неважно. Кроме того, как я писал, XHTML как раз обеспечивает полную несовместимость с IE. Кстати, сайт http://agat.in/ отдается браузерам в виде text/html, и парсится как HTML. А единственный, кто парсит его как XHTML — валидатор — находит там 2 ошибки. Кстати, довольно незначительных. И очень хорошо, что пользователи могут видеть сайт, а не обращать внимание на отсутсвие alt в двух местах.
edgy:
Неправильно понять, в общем-то, можно все, что угодно. Я могу лишь стараться написать все доходчиво, но я не властен над нежеланием понять. Если написал не доходчиво, то по результатам комментариев напишу еще статью. Но пока я не вижу ни одного конкретного возражения, если честно.
Это, кстати, опять не я придумал :-).
Эти люди — одни из самых известных евангелистов стандартов в мире, и тема эта, вообще-то, известна в англоязычном интернете очень давно, я лишь собрался у нас это все изложить.
А, вот забыл... Насчет того, что блогный софт должен следить за well-formed'ностью. Да, наверное должен. Но факт состоит в том, что большинство софта, которым пользуются люди, это не делают. Что в свою очередь тоже показывает отсутствие необходимости.
В общем то, конкретных возражений не возникает, поскольку собраны соответствующие истине вещи, вызывает неприятие общий настрой статьи.
Особенно "пугалка" и рекомендации в конце. Не было бы их, был бы хороший пост, провоцирующий на интересную, возможно, дискуссию по актуальному, как видим, вопросу.
Пугалка абсолютно не пугает, вот нисколько, честно. Это не сложно, и Вы это понимаете. Это даже полезно, нужен хоть какой-то порог вхождения, простота html уже сыграла свою вредную роль.
Если есть какие-то проблемы с написанием xhtml, может быть не стоит его вообще писать? Это не rocket science, но свои правила и здесь есть.
Пусть у xhtml очень мало плюсов на данный момент, но ведь они есть? А какие плюсы у html, кроме тех, что его "проще" писать, что тоже, я думаю, у многих уже не так?
Мне бы, для валидности HTML пришлось потом кавычки стирать специально и слэши убирать у одиночных тегов.
о! спасибо за статью :-) дам ссылку паре человек.. у самого всё руки не доходили до написания чего-то подобного.
Наш выбор: html 5 :)
ну.. слеши — это понятно. а кавычки-то зачем?
Обычное дело, не только для форумов веб-разработчиков. Форум надо осторожно выбирать.
Ok, пугалка не страшная :-). Опишу в следующей статье случай, когда у одного и того же сурса в XHTML и HTML режимах получается разный DOM. Моя основная мысль в том, что эти вещи многим просто неизвестны, и поэтому если уж хочется писать именно XHTML, надо про них знать. И надо знать про то, что писать на чистом XHTML не получится (например сокращать парные пустые теги), придется писать XHTML, совместимый с HTML, что, опять-таки, дает больше работы.
У HTML есть один большой плюс — он рапространен. Большинство того, что сейчас самими авторами считается XHTML'ом, им не является с того момента, как сурс отдается браузеру. Поэтому вопрос не в том, стоит ли переходить с XHTML на HTML, а как раз наоборот: если у вас есть рабочий HTML, нет оснований прибавлять себе работы.
Пишу так:
Но на ожидаемое дерево документа IE выдает строку "text".
Сорри, забыл скобки заменить.
Пишу так:
<?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> <meta http-equiv="Content-Type" content="application/xhtml+xml"> <title>Untitled</title> </head> <body> <tag>text</tag> </body> </html>
Тут не в коде дело. Чтобы заставить IE воспринимать документ как XHTML, надо либо подкрутить на сервере, чтобы Content-type был "application/xhtml+xml", либо, если это файл на диске, дать ему расширение ".xml"
P.S. Кстати, насчет кода в комментариях. Если лень заменять <