Баг IE?

2354570

Наткнулся на такую странность, IE 6.
Веб-страница:

<!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" lang="en" xml:lang="en">

<head>
<title>Test page</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="scripts/menu.js" />
<script type="text/javascript"> </script>
</head>

<body>
test
</body>
</html>

Обратите внимание на строчки script в секции head. При таком расположении IE 6 всё показывает нормально. Но если сделать так (поменять их местами):

<script type="text/javascript"> </script>
<script type="text/javascript" src="scripts/menu.js" />

- не отображает содержимое body вообще. Причём огнелис всё показывает правильно.
Если же сделать так (закрыть второй <script> явно):

<script type="text/javascript"> </script>
<script type="text/javascript" src="scripts/menu.js"></script>

- всё показывается.
Но в шапке-то документ заявлен как XHTML, ему прописана соответствующая схема. А значит, если элемент пуст, то можно закрывать первый же тег - <tag ... />. Разве это не распространяется на тэг <script>? Правильно ли себя ведёт IE, или это всё-таки баг? Ведь даже если предположить, что парсер явно ищет закрывающий тег - то почему не выдаются сообщения об ошибках JS?

2354570

Пока нашёл только такое в одной книге:
Обязательно убедитесь, что в код добавлен дескриптор окончания сценария. Все строки кода JavaScript должны быть расположены между двумя дескрипторами начала и завершения сценария. Если не поставить дескриптор завершения сценария, то он может просто не запуститься, а документ HTML будет выглядеть довольно странно.

Но всё равно непонятно, почему общие правила XHTML не распространяются на <script>

ifani

IntelliJ IDEA тоже ругается, если не закрывать явно script отдельным тэгом (прям так и говорит, что в IE это не прокатит) - как раз недавно обратил на это внимание, проверил, что, действительно, IE начинает глючить, удивился и забил

2354570

IE начинает глючить, удивился и забил
А и я бы забил, если бы не пришлось этот баг ловить =) А когда обнаружил такое - очень удивился.

artimon

IE не понимает XHTML. Он его парсит как HTML.
Более того, на самом деле все браузеры его парсят как html если у него Content-type text/html.
Что бы FF или Opera парсили документ как XHTML его нужно отдавать с правильным Content-Type: application/xhtml+xml, но тогда IE его не открывает, а предлагает сохранить…

2354570

С другой стороны, мы проверяли - DOCTYPE-таки влияет на поведение парсера IE.

artimon

Парсера или рендеринга?

2354570

Парсера или рендеринга?
Разве это не взаимосвязанные вещи? Ведь то представление, которое впоследствии рендерится, формируется на этапе парсинга, разве нет? И тут уж от настроек парсера зависит, злой зарубит ошибки и отрендерится всё криво.

Maurog

я хоть и далек от веб-технологий, но ясно осознаю, что парсер и рендер - две абсолютно разные и несвязанные компоненты.
сначала идет парсинг
затем считанную информацию обрабатывает рендер и формирует картинку.
судя по тому, что сайты показываются еще до полной загрузки говорит о том (режим телепатии что парсер работает с callback`ами в рендер (например после каждого закрытого тега сообщает уже считанную структуру рендеру и тот формирует частичную картинку)

2354570

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

Maurog

да, все верно
ты ж профи в этом

pitrik2

что на формируемую рендером картинку влияет строгость парсера - это вполне логично
и что?
это не противоречит тому, что доктайп влияет на рендеринг, а на парсер не влияет

2354570

ты ж профи в этом
Увы, нет, ни парсю, ни рендерю..

2354570

это не противоречит тому, что доктайп влияет на рендеринг, а на парсер не влияет
Почему?
Парсер встретил доктайп -> стал, к примеру, строже -> поменялось внутреннее представление -> изменилась картинка. Не напрямую жеж с HTML-кода картинка рендерится?

pitrik2

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

2354570

Зато я тебя понимаю =)
Просто мне кажется, что рендер не сверяется с доктайпом а тупо визуализирует внутреннее представление, не проводя дополнительного анализа исходника. При этом, дефолтовые значения всяких там стилей от доктайпа также не зависят, они прошиты где-то глубоко и переопределяются только CSS-ом.
Что касается предыдущего поста, то я только имел ввиду то, что указанная в доктайпе DTD-схема влияет именно на поведение парсера, что и отражается на внутреннем представлении. Но это опять же завязано на моём предположении о том, что рендерер не смотрит код.
Короче, без знания устройства IE - это разговор ни о чём Истина где-то там. В Редмонде.

artimon

Просто мне кажется, что рендер не сверяется с доктайпом
В IE >= 6 вообще два движка рендеринга и в зависимости от доктайпа выбирается один из них. А после этого, рендеринг действительно не сверяется с доктайпом, ему просто незачем. Раз он работает, значит доктайп был таким, что надо запускать его. Но дефолтные значения стилей у этих движков разные.

2354570

О, а где об этом можно почитать?
Интересно.
Оставить комментарий
Имя или ник:
Комментарий: