Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Странное поведение браузеров (https://javascript.ru/forum/misc/3468-strannoe-povedenie-brauzerov.html)

Dicot 23.04.2009 11:57

Странное поведение браузеров
 
Здравствуйте.
Написал вот такую страничку и обнаружил, что браузеры (пробовал FireFox 3.0.8 и IE 6) её криво парсят: принимают строку "</script>" за конец элемента script.
Это баг такой или я чей-то не понимаю.
Объясните, пожалста.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <script type = "text/javascript">
      alert("</script>");
    </script>  
  </body>
</head>

Kolyaj 23.04.2009 12:14

Обычное поведение.
alert("</scr" + "ipt>");

Gvozd 23.04.2009 18:14

начнем с того, что если вы используете XHTML, то вы обязаны оборачивать код JS-а в блок CDATA

Dicot 23.04.2009 23:03

Если Вы имеете в виду doctype, так его можно убрать - будет то же самое

x-yuri 24.04.2009 01:36

Цитата:

начнем с того, что если вы используете XHTML, то вы обязаны оборачивать код JS-а в блок CDATA
Gvozd, а ты можешь привести пример проблемы, с которой можно столкнуться? А то в спецификации вроде написано, а придумать какой-то проблематичный пример у меня пока не получилось

Цитата:

Написал вот такую страничку и обнаружил, что браузеры (пробовал FireFox 3.0.8 и IE 6) её криво парсят: принимают строку "</script>" за конец элемента script.
Это баг такой или я чей-то не понимаю.
Объясните, пожалста.
http://www.w3.org/TR/html401/types.html#type-cdata

x-yuri 24.04.2009 01:38

Dicot а что валидатор говорит? http://validator.w3.org/

Kolyaj 24.04.2009 09:48

Цитата:

Сообщение от x-yuri
пример проблемы, с которой можно столкнуться?

Только валидатор.

Dicot 24.04.2009 15:58

Седня первый раз поразвлекался с валидатором - забавная весчь :)
<!DOCTYPE HTML PUBLIC  "-//W3C//DTD HTML 4.01//EN" 
  "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
    <title>test</title>
  </head>
  <body>
    <script type="text/javascript">
      alert("</script>");
    </script>
  </body>
</html>

-этот текст ему не нравится.
Вы, x-yuri, имели в виду эту строку спецификации:
"The first occurrence of the character sequence "</" (end-tag open delimiter) is treated as terminating the end of the element's content. In valid documents, this would be the end tag for the element." ?
Т.е. мой текст неправильный :(
Kolyaj этот фокус
alert("</scr" + "ipt>");

не проходит по той же причине.
Возникает вопрос, какая ж польза от ентого валидатора акромя вреда.
... если я ошибаюся, то как вывести строку "</script>" :)

Kolyaj 24.04.2009 16:00

Цитата:

Сообщение от Dicot
как вывести строку "</script>"

Я повторю, трудно чтоли
alert("</scr" + "ipt>");

Dicot 24.04.2009 16:10

<!DOCTYPE HTML PUBLIC  "-//W3C//DTD HTML 4.01//EN" 
  "http://www.w3.org/TR/html4/strict.dtd">
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
    <title>test</title>
  </head>
  <body>
    <script type="text/javascript">
      alert("\u003c\u002fscript>");
    </script>
  </body>
</html>
- это прокатывает

Dicot 24.04.2009 16:13

Kolyaj строку то вывести не трудно и даже браузер ето нормально кушает, а вот валидатор - нед

Kolyaj 24.04.2009 16:35

Вывод строки на валидатор не влияет. На него влияет то, что Gvozd сказал.

Dicot 24.04.2009 17:13

а если html-евский doctype использовать все равно эта cdata нужна?

x-yuri 24.04.2009 17:23

Цитата:

Возникает вопрос, какая ж польза от ентого валидатора акромя вреда
от него только польза вообще-то, по сообщениям валидатора ты бы мог сам разобраться в чем дело
Цитата:

Вы, x-yuri, имели в виду эту строку спецификации
да, и я бы предложил следующие способы, как исправить ситуацию (чтобы валидатор не ругался): '<'+'/script>', '<\/script>'
Цитата:

а если html-евский doctype использовать все равно эта cdata нужна?
нет, http://www.w3.org/TR/xhtml1/#h-4.8
http://www.w3.org/TR/xhtml1/dtds.htm...ict.dtd_script
http://www.w3.org/TR/html401/interac...ml#edef-SCRIPT
p.s. есть подозрение, что ты document.write используешь, так вот лучше его не использовать

Dicot 25.04.2009 14:19

<!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="text/html; charset=utf-8" />  
    <title>test</title>
  </head>
  <body>
    <script type="text/javascript">
    <![CDATA[
      alert("</script>");
    ]]>
    </script>
  </body>
</html>

- этот текст действительно нравится валидатору, только вот в браузерах отображается неверно :( (cdata не спасает)
Да, действительно использовал write(). А что в нем плохого?
Мне, например, нужно было создать новое окошко с некоторым содержимым. Если создавать элементы методами DOM - это ж сколько кода...
А если так:
newWin.document.open('text/html');
newWin.document.write(text);
newWin.document.close();

- всего 3 строчки

Kolyaj 25.04.2009 14:32

Цитата:

Сообщение от Dicot
этот текст действительно нравится валидатору, только вот в браузерах отображается неверно

Я вам два раза уже написал. Браузер берет текст скрипта до тега </script>, поэтому его нельзя использовать во внедренных в HTML скриптах.

Gvozd 25.04.2009 15:05

Это кушается на отлично валидатором, оперой и ослом.
второй огнелис запарывается на парсинге.
видимо их движок в меньшей степени расчитан на поддержку XHTML
UPD: Хром тоже нормально работает.третий огнелис не научился адекватно работать
Код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>тест</title>
<script type="text/javascript">
<!--//<![CDATA[
alert("</script>");
//]]>-->
</script>
</head>
<body>
</body>
</html>

а вот этот вариант нравится всем:
Код:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>тест</title>
<script type="text/javascript">
<!--//<![CDATA[
alert("</scr"+"ipt>");
//]]>-->
</script>
</head>
<body>
</body>
</html>

Мораль:для кросбраузерности все же надо использовать второй вариант.
Мораль2:про валидатор также не забываем.очень полезный инструмент

x-yuri 25.04.2009 16:25

Цитата:

Да, действительно использовал write(). А что в нем плохого?
Мне, например, нужно было создать новое окошко с некоторым содержимым. Если создавать элементы методами DOM - это ж сколько кода...
скрипты в body приостанавливают дальнейший рендеринг страницы, смешивается разметка с кодом, часто создают проблемы начинающим. В общем, обычно он ничего хорошего не приносит
но в твоем случае может и оправдано. Хотя можно было для нового окна сделать свою html-страничку и скорректировать ее после загрузки, при этом в твоем скрипте было бы лучше видно, какая информация в него передается (если такая вообще есть)

Dicot 25.04.2009 17:55

Gvozd а про то, что cdata надо так хитро прятать в комментарии тоже в спецификации написано?

x-yuri 25.04.2009 18:11

Цитата:

про то, что cdata надо так хитро прятать в комментарии тоже в спецификации написано?
это есть здесь - Sending XHTML as text/html Considered Harmful

Dicot 25.04.2009 18:49

Насколько я понял из статьи, дело в том, что браузеры не поддерживают XHTML. Может тогда лучше использовать HTML 4, вместо того, чтоб изобретать различные хаки для XHTML?

x-yuri 26.04.2009 03:38

там речь идет об xhtml, который отправляется браузеру с заголовоком text/html, и из нее можно вынести недостатки такого подхода... в частности, там написано, как надо писать встроенные скрипты, таблицы стилей... хотя это несколько отличается от варианта, предложенного Gvozd. Я просто попытался найти подобное оформление содержимого этих тэгов, но может Gvozd укажет свой источник ;)

Dicot 26.04.2009 17:01

Неужели дело в заголовке?
Я попробовал так:
<meta http-equiv="Content-Type" content="text/xml; charset=utf-8" />

и так:
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />

- ниче не изменилось (для браузеров).
Или тип содержимого указывается как-то подругому?

x-yuri 26.04.2009 18:28

Dicot, я просто ответил на твой вопрос
Цитата:

про то, что cdata надо так хитро прятать в комментарии тоже в спецификации написано?
а что у тебя до сих пор не работает я не знаю, но есть подозрение, что надо повторить третий раз:
Цитата:

Сообщение от Kolyaj
Я вам два раза уже написал. Браузер берет текст скрипта до тега </script>, поэтому его нельзя использовать во внедренных в HTML скриптах


Gvozd 26.04.2009 18:35

http://dimox.name/xhtml-validation-u...flash-noindex/
это про CDATA
в моем посте с кодо, почему-то делается перенос после alert("</script>, сейчас сделаю просто в виде кода тот пост

x-yuri 26.04.2009 19:18

да, в общем разные есть варианты оформления содержимого тэга script, и какой из них использовать - хз

Dicot 26.04.2009 19:54

Насчет script я уже все понял.
Просто хотел уточнить насчет того где задаётся тип содержимого и влияет ли он на поведение браузера (см. пост № 23)

x-yuri 26.04.2009 20:04

а-а, задавать его с помощью тэга meta можно разве что на всякий случай, а вообще Content-Type - это заголовок и его можно задавать в настройках apache, добавлять к ответу с помощью функции header (php) и т.д.


Часовой пояс GMT +3, время: 16:58.