Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Ошибка в IE7 при сочетании location, document.domain, document.write (Furax)
Author Message
Furax
Участник форума



Joined: 07 Sep 2007
Posts: 25
Карма: 12
   поощрить/наказать


PostPosted: Mon Mar 02, 2009 3:21 pm (написано за 5 минут 53 секунды)
   Post subject: Ошибка в IE7 при сочетании location, document.domain, document.write
Reply with quote

Доброго всем времени суток!

Вчера полдня и сегодня час бился над тем, почему IE7 не всегда изволит выполнять мой код. В итоге вылезло вот что: этот глюк проявляется (в простейшем случае) вот на такой странице:
Code (any language): скопировать код в буфер обмена
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
  <meta http-equiv="Content-type" content="text/html; charset=windows-1251">
  <title>Test</title>
 </head>

 <body>

  <script type="text/javascript">
  <!--

    var a = location.host.toLowerCase();
    document.domain = document.domain;
    document.write('<scr'+'ipt type="text/javascript">alert("!!!");</scr'+'ipt>');

  //-->
  </script>

 </body>
</html>
При этом обязательным условием является то, чтобы страница была открыта по сетевому URL, а не с локального диска.

Казалось бы, где тут могут быть глюки (в трёх элементарных строках-то!)? Ан нет! Алерт выполняется далеко не всегда (примерно 1 раз на 10 обновлений страницы, в том числе с полной перезагрузкой браузера). При этом стоит закомментировать хоть одну из первых двух строк, как всё начинает работать как часы.

Собственно вопрос: никто случайно не знает, что это за чушь и можно ли с ней как-то бороться? Создать скрипт через DOM-методы ишак также не даёт, выдавая ошибку в момент добавления TextNode с текстом скрипта к самому скрипту через appendChild. Вариант с innerHTML (для созданного через document.createElement объекта скрипта) комментируется ещё лучше: "Неизвестная ошибка выполнения". Правда, выход есть: если для этого вновь созданного скрипта указать не текст, а src, то его загрузка и последующее выполнение, вроде бы, производятся. Но это неудобно, т. к. добавляется лишнее обращение к серверу, лишний траффик и т. д. К тому же в проекте, где я с этим столкнулся, мне надо динамически загрузить в этом месте несколько скриптов, и очерёдность выполнения важна: сначала грузится (и выполняется) несколько скриптов с сервера, а после них выполняется тот, который пишется в открытом виде (как в моём примере); насколько я понимаю, при загрузке скриптов через DOM эта очерёдность не гарантируется (поправьте, если я не прав). А перед этим приходится как работать с location.host, так и выставлять корректный document.domain (без "www").

Кстати, если приколоться и вместо alert() вызвать, скажем, qalert(), то поведение ишака становится ещё забавнее: он пытается вывести окно сообшения об ошибке, но в самом этом окне происходит ошибка (как это по-Microsoftовски!..), и сообщение не выводится.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Mon Mar 02, 2009 3:46 pm (спустя 25 минут; написано за 1 минуту 27 секунд)
   Post subject:
Reply with quote

Забавная бага.
Я бы сделал как-то так:
Code (JavaScript): скопировать код в буфер обмена
    var a = location.host;
    if (a != document.domain) document.domain = a.replace(/www\./i,"");
lowercase там совсем не нужен.

Видимо у IE что-то во внутренностях не может утрястись при виде такого вольного обращения с секурити =)
Back to top
View user's profile Send private message
Furax
Участник форума



Joined: 07 Sep 2007
Posts: 25
Карма: 12
   поощрить/наказать


PostPosted: Mon Mar 02, 2009 3:58 pm (спустя 12 минут; написано за 4 минуты 51 секунду)
   Post subject:
Reply with quote

lowercase остался от полной версии скрипта, которая проверяет, расположен ли сайт на narod.ru (это обязательное требование) и сохраняет имя этого народовского сайта. А domain, соответственно, устанавливается в siteName.narod.ru (для чтения куков), а при общении с гостевой меняется на narod.ru.

Да и от lowercasа там ничего не меняется: чтобы ишак упёрся, хватает простого упоминания в коде объекта location:
Code (any language): скопировать код в буфер обмена
    location;
    document.domain = document.domain;
    document.write('<scr'+'ipt type="text/javascript">alert("!!!");</scr'+'ipt>');
Если в первой строке вместо location поставить, скажем, window, или убрать вторую строку - то всё работает. Пробовал уже писать вместо 'location' всякие глупости вроде "window['loc'+'ation']" - не помогает...
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Mon Mar 02, 2009 4:03 pm (спустя 4 минуты; написано за 59 секунд)
   Post subject:
Reply with quote

Furax
Мой вариант работает, и location там есть.
ну и проверить всё можно регом, без lowercase.
Back to top
View user's profile Send private message
Furax
Участник форума



Joined: 07 Sep 2007
Posts: 25
Карма: 12
   поощрить/наказать


PostPosted: Mon Mar 02, 2009 4:13 pm (спустя 9 минут; написано за 3 минуты 17 секунд)
   Post subject:
Reply with quote

WingedFox
Он работает в том случае, если условие ifа не выполняется; после любой операции с document.domain всё летит к чёрту, а у меня гарантированно потребуется в дальнейшем изменить document.domain (чтобы обратиться к гостевой).

Насчёт регэкспа спасибо, действительно будет проще.

Компромисс вроде бы нашёл: в самом начале проверять не location.host, а document.domain: вроде бы в этом случае у IE крыша не едет. Насколько я понимаю, нежелательных последствий такой подход иметь не должен?
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Tue Mar 03, 2009 10:55 am (спустя 18 часов 42 минуты; написано за 43 секунды)
   Post subject:
Reply with quote

Как оказалось, достаточно воспользоваться явным приведением location.host к строке, чтобы всё заработало нормально.
Back to top
View user's profile Send private message
Furax
Участник форума



Joined: 07 Sep 2007
Posts: 25
Карма: 12
   поощрить/наказать


PostPosted: Tue Mar 03, 2009 12:03 pm (спустя 1 час 8 минут; написано за 46 секунд)
   Post subject:
Reply with quote

Чудны дела твои, Ктулху!

Спасибо! Вроде заточил-таки под ишака свой код.
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Tue Mar 03, 2009 12:30 pm (спустя 27 минут; написано за 30 секунд)
   Post subject:
Reply with quote

Furax
Не поминай Ктулху всуе, пусть спит долго и спокойно ;-)
Back to top
View user's profile Send private message
Furax
Участник форума



Joined: 07 Sep 2007
Posts: 25
Карма: 12
   поощрить/наказать


PostPosted: Tue Mar 03, 2009 1:25 pm (спустя 54 минуты; написано за 1 минуту 8 секунд)
   Post subject:
Reply with quote

Кстати, выяснилось, что ишак для нескольких <script>ов, добавленных через document.write, очерёдность выполнения ни разу не соблюдает, так что это... Граждане! Будьте бдительны!
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML