Влияет ли выбор DOCTYPE на DOM с точки зрения кода javascript?

Учитывая большой устаревший проект, использующий технологии ASP.NET, javascript, css и т. д., мне было интересно, можно ли каким-либо образом изменить DOCTYPE веб-страниц, скажем, с HTML 4.0 Transitional на XHTML 1.0 Transitional (или наоборот). может нарушить функции javascript веб-страниц.

Существует множество статей и дискуссий о том, как различные DOCTYPES влияют на (css) рендеринг страниц, но я не могу найти ничего похожего на предмет взлома любого кода.

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


person Joergen Bech    schedule 10.09.2009    source источник


Ответы (2)


Сломает ли изменение DOCTYPE какие-либо функции javascript, действительно зависит от того, насколько защищены эти функции :)

Например, когда документ отображается в режиме совместимости, document.body (BODY) становится так называемым "корневым элементом"; при отображении в стандартном режиме этот корневой элемент обычно представляет собой document.documentElement (HTML). Это довольно существенное отличие. Если скрипт, который определяет размер экрана браузера, всегда запрашивает свойства clientWidth/clientHeight вне document.documentElement, он, очевидно, сообщит о неверных результатах в режиме причуд (поскольку IIRC, document.documentElement.clientWidth/clientHeight будет представлять размеры элемента HTML, а не экранные).

Большинство библиотек JS обычно явно указывают, поддерживается ли режим quirks (мы — Prototype.js — например, не поддерживаем режим quirks).

Говоря о HTML vs XHTML, для того, чтобы браузер отображал документ как XHTML, вы должны в первую очередь обслуживать его с правильным заголовком «Content-type» (т. е. application/xhtml+xml). Если вы измените тип документа только на XHTML, но по-прежнему будете использовать документ как "text/html", большинство известных мне браузеров все равно будут анализировать (и отображать) его как HTML-документ.

Обратите внимание, что на сегодняшний день IE не понимает «настоящий» XHTML-контент, поэтому рекомендуется использовать документы как text/html (с типом документа HTML4.01) (если, конечно, IE не входит в число поддерживаемых браузеров). .

Что касается особенностей DOM в «настоящих» документах XHTML, я слышал, что некоторые вещи, такие как document.write, «не работают» и что доступ к атрибутам узла всегда должен выполняться через getAttribute/setAttribute (а не через более простые методы доступа к свойствам). IIRC, есть также некоторые проблемы с innerHTML.

Отсутствие информации о DOM в «настоящих» документах XHTML, вероятно, связано с его непрактичностью в документах/приложениях для общей сети (т. Е. Отсутствием поддержки IE для этого).

person kangax    schedule 11.09.2009
comment
В некоторых режимах документа элементы dom не наследуются от Object.prototype, и поэтому их нельзя расширить с помощью пользовательских методов или свойств... - person inf3rno; 01.07.2013

Если вы используете DTD:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

тогда ваш сайт находится в причудливом режиме в IE и в почти стандартном режиме в современных браузерах, и поскольку переходный dtd xhtml 1.0 заставляет страницу находиться в стандартном режиме, будут проблемы с макетом и потенциальные проблемы в Javascript (особенно в IE) как есть некоторые существенные различия между тем, как DOM отображается в причудах и стандартах.

Однако если DTD HTML 4.01 содержит системный идентификатор:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">

Он уже должен быть в стандартном режиме. Вы можете проверить, запросив «document.compatMode» на своем сайте, он скажет «CSS1Compat», если он находится в стандартах, иначе «BackCompat», если в режиме причуд.

Я предполагаю, что вы собираетесь обслуживать Content-Type text/html с XHTML 1.0 Transitional.

person meder omuraliev    schedule 10.09.2009
comment
Я проверил проблему с частичным/полным типом документа. Я провел аналогичный тест для частичного/полного типа документа xhtml 1.0, и оказалось, что оба из ‹!DOCTYPE html PUBLIC --//W3C//DTD XHTML 1.0 Transitional//EN w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd› и ‹!DOCTYPE html PUBLIC -// W3C//DTD XHTML 1.0 Transitional//EN› заставляют браузеры отображать страницу в режиме соответствия стандартам, т. е. частичный тип документа xhtml не переводит страницу в специальный режим, как в случае HTML 4.01. Странный. - person Joergen Bech; 10.09.2009