Почему рушится ИЕ (задачка на подумать)
Решил вынести отсюда в отдельную тему задачку, которая в свое время выносила мне мозг.
Попробуйте открыть в ИЕ следующую страничку <html> <head> <base href="/" /> <script type="text/javascript"> var head=document.documentElement.firstChild; // Есть и другие варианты получить head. Кому как удобнее. var js=document.createElement('script'); js.type='text/javascript'; js.src='script.js'; head.appendChild(js); </script> </head> <body> </body> </html> Небольшие хинты, которые сэкономят время в случае заинтересованности: 1. Если ИЕ уже порушился, то обновлять страницу бесполезно, даже если она была изменена. Нужно перезагружать ИЕ. 2. Чтобы избавится от пункта 1, можно открывать проблемную страницу в iframe. И еще один хинт: проблема тут на стыке сразу двух багов. Если кто-то видел, как я это уже описывал, просьба попридержать :) |
ты забыл указать, что ie6 рушится? А ie7, кстати, просто не подгружает (запускает) script.js
p.s. прикрепи, плз, исходники ie6, без них тяжело как-то думается :yes: |
После прописывания
<base href="/" />IE6 Перестал находить файл, указанный в адресной строке (Internet Explorer cannot open the Internet Site [url]), а не файл подключаемого скрипта. Появилось предположение, что в аттрибуте href нежно указывать полный путь к html документу(http://domain.zon/doc.html). После этого скрипт стал загружаться, но ИЕ всё равно падал(!). Судя по сообщению (Internet Explorer cannot open the Internet Site [url]) это действительно баг ИЕ, т.к. html-то мы открыли(скрипт подключился), а в сообщении пишет совсем другое. |
Если же мы перенесём наш скрипт в body, баг пропадает...
|
Чтобы не смущало отсутствие подключаемого скрипта, можно так
<html> <head> <base href="/" /> <script type="text/javascript"> var head=document.documentElement.firstChild; var js=document.createElement('script'); js.type='text/javascript'; js.src='http://javascript.ru/forum/images/ca_serenity/misc/scripts.js'; head.appendChild(js); </script> </head> <body> </body> </html> |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
<html> <head> <base href="http://www.yandex.ru/" /> <script type="text/javascript"> var head=document.documentElement.firstChild; var js=document.createElement('script'); js.type='text/javascript'; js.src='http://javascript.ru/forum/images/ca_serenity/misc/scripts.js'; head.appendChild(js); </script> </head> <body> </body> </html>Рушится. |
Цитата:
|
Цитата:
http://www.yandex.ru/ и http://javascript.ru/... Найди 10 отличий называется... Вот мой html, при котором ие7 грузит скрипт <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html> <head> <base href="http://cs/test/test.html" /> <script type="text/javascript"> var head=document.documentElement.firstChild; var js=document.createElement('script'); js.type='text/javascript'; js.src='script.js'; head.appendChild(js); </script> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head> <body> test </body> </html> Домены должны совпадать, как ты считаешь? |
DOCTYPE роли не играет.
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
|
Вобщем ие7 грузит скрипт, когда в base указан базовый урл, с которого ты грузишь html. Это и верно, потому что значение должно быть именно таким. если ты напишешь google.ru в base, то при, например, <img src="www.site.ru/img/logo.jpg"/> ,ие будет грузить с http://google.ru/www.site.ru/img/logo.jpg... Понимаем?!
|
Вобщем тесты показывают, что ие6 падает при любой попытке вставить тег в хед, если там есть base с любым значением href... пох скрипт это или стили или мета...
|
Цитата:
|
Сдаёцца мне что на вопрос "Почему рушится ИЕ" нам смогут ответить только парни из микрософта... Это как же нужно прикрутить подержку тега криво?!:lol:
|
А всё потому. что привыкли всё воровать/отбирать у других, а самим что-то сделать - руки кривые... Линух - форева! Парни молодцы!
|
Ну почему же. Я знаю, просто для интереса запостил.
|
Ура, товарисчи!
Щя всё напишу;) |
Вопсчем так... на вопрос "Почему рушится ИЕ" ответа пока не нашёл... Возможно нужно просто логически подумать... Но нашел способ, который обойдёт ентот баг.
Вопсчем задачи у нас такие: 1. Имеем тег base с установленным атрибутом href в значение / или в любое другое. 2. Скриптом. расположенным в хэде необходимо вставить скрипт/стиль/мета и т.д в тот же хэд. 3. Не упасть. Вопсчем решение такое. Незнаю почему, но падение вызвано методом appendChild. Вместо этого мы можем использовать и другие методы дом, например, такие, как insertBefore. Еси поправить наш скрипт, то получим такое: <base href="/" /> <script type="text/javascript"> var head=document.documentElement.firstChild; var js=document.createElement('script'); js.type='text/javascript'; js.src='script.js'; head.insertBefore(js,document.documentElement.firstChild.lastChild); </script> Скажу сразу, что этот код не будет работать, т.к. у нас неправильно установленно значение href для base. Если мы не можем его исправить - путь к скрипту указываем полный. Если можем - правим на правельный и тогда все относительные ссылки у нас будут рабочими. По поводу конструкции document.documentElement.firstChild.lastChild. Код document.documentElement.firstChildполучает наш хэд(можно и по-другому), а lastChild указывает нам на узел, перед которым нужно вставлять то, что требуецца. Узел может быть любым, хоть первым, хоть последним. Вот собсно и всё. |
B~Vladi,
это все понятно. Использование insertBefore вместо appendChild, если падает ИЕ -- классическое решение. Вопрос не в этом. А ответ намного более удивительный, чем вы себе представляете :) |
Цитата:
Цитата:
|
Kolyaj, ты шайтан млин, тебе п книшшки писать а не на форумах сидеть с кучей ответов в голове и ждать пока какой-нить прогер попросит помощи.
|
Это кста относицца ко многим месным...
|
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Собственно, объяснение.
http://kolyaj.ya.ru/replies.xml?item_no=1911 + http://kolyaj.ya.ru/replies.xml?item...ly-kolyaj-1900 Цитата:
Цитата:
Цитата:
|
Мда... никогда не писал и не буду его писать в своём html:)
|
Цитата:
|
Ну этот я код у B~Vladi спер, в моей задаче он не принципиален.
|
Цитата:
Цитата:
|
Цитата:
|
Ну это понятно. Это был всего-лишь пример. Получить хэд грамотно не для кого не проблема, не суть.
|
я так и написал
Цитата:
|
To Kolyaj
Ну да, что-то я упустил :) Действительно, замечательный IE6-only баг :) Спасибо, возьму на заметку |
Часовой пояс GMT +3, время: 18:00. |