» Форма входа

»Мoy-weB ver.4.1

» Статистика

Главная » 2008 » Сентябрь » 20 » XHTML, говорите?

XHTML, говорите?
20.Сен.2008 | 21:54:41

XHTML, говорите?


Одна из самых печальных вещей, которую я замечаю, когда набредаю на
русскоязычные веб-разработчицкие сообщества — это полное нежелание
разбираться в сути вопросов. Когда что-то у кого-то не получается, он
сначала спрашивает это в форуме, где куча самозванных “гуру” начинает
ему рассказывать несусветную чушь. Потом, если повезет, кто-нибудь даст
ссылку на какую-нибудь более-менее адекватную статью, которая может
частично касаться вопроса. Совет же почитать первоисточник (например
спецификацию языка) обычно воспринимается как издевательство, потому
как по-английски все “свободно разговаривают” только в своих резюме.

Все это приводит к тому, что русское веб-сообщество полно совершенно странных мифов, пугающе противоречащих логике:

* “надо верстать и таблицами, и 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, который требует, чтобы эти амперсанды
были экранированы (&amp;).

Пугалка


Если
все вышенаписанное не убедило вас в бесполезности XHTML и вы вопреки
здравому смыслу думаете, что “это все равно правильно”, то я хочу вас
еще немного попугать. Потому что эти настроения обычно подкрепляются
мнением, что “обэксемелить” HTML — задачка все равно простая. Чего там,
в общем-то: закрыть все теги, откавычить атрибуты, экранировать
амперсанды и вставить слеши в одиночные теги. На самом деле все
несколько сложнее. Вот небольшой и неполный список, во что это
выливается:

*

Содержимое элементов <script> и
<style> нельзя оставлять в том же виде, что и в HTML. Потому что
любой значок “>” тут же все сломает. Если его экранировать через
“&gt;” или заключать в блоки 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 схлопнутся в пробелы.
Чтобы этого не было придется их экранировать: “&#13;&#10;”.
*

Фоновый цвет 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’ом, разделением
содержимого и оформления и стали бы читать спецификации хотя бы и
только для того, чтобы повесить на страницу бесполезную кнопочку
валидации. Пусть… Главное — общий эффект :-)
Категория: Статьй и уроки | Просмотров: 502 | Добавил: CorsaR
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]