03.06.2009, 12:11
|
Новичок на форуме
|
|
Регистрация: 19.02.2008
Сообщений: 9,177
|
|
Собственно, объяснение.
http://kolyaj.ya.ru/replies.xml?item_no=1911 + http://kolyaj.ya.ru/replies.xml?item...ly-kolyaj-1900
Цитата:
|
Очень неприятная ошибка в ИЕ6. Проявляет себя тем, что выскакивает окошко с текстом "Не удалось открыть узел http://test.ru/ Операция будет прервана" после чего показывает "Невозможно загрузить страницу."
Условия воспроизведения:
Пусть у нас есть тег T (это может быть head, body и вообще любой тег) и в любом из его детей есть скрипт, который добавляет методом appendChild детей в T. Вот этот appendChild и вызывает проблему. Если скрипт находится непосредственно в T, то ошибки не будет.
Решение проблемы:
Добавлять детей методом insertBefore перед любым существующим элементом или переместить скрипт в другое место.
Особый случай:
Может случиться так, что ваш скрипт лежит в head и элементы добавляет тоже в head. Казалось бы ничего страшного произойти не должно, но если у вас есть тег base, то страшное случится. Т.е. в результате окажется, что скрипт лежит не в head, а в base, и ошибка воспроизведется.
|
Цитата:
|
В результате у тега body parentNode равен тегу base. Т.е. если идти по парентам вверх от какого-нибудь элемента, то получим что-то вроде div -> body -> base -> head -> html.
При этом если от html рекурсивно идти вниз по коллекции childNodes, то получится, что элемент body со всем своим поддеревом одновременно является ребенком тега base и тега html.
Вот это код можно обернуть в букмарклет и позапускать в ИЕ6 на любой странице с тегом base, например, на сохраненках яндекса.
function getChildrens(e, level, maxLevel) {
var childrens = [];
for (var i = 0; i < e.childNodes.length; i++)
if (e.childNodes[i].nodeType == 1)
childrens.push(e.childNodes[i]);
var response = [];
var tab = '';
for (var i = 0; i < level; i++)
tab += '\t';
for (var i = 0; i < childrens.length; i++) {
var item = tab + childrens[i].tagName + (document.body == childrens[i] ? '*' : '');
var childs = '';
if (level < maxLevel) {
childs = getChildrens(childrens[i], level + 1, maxLevel);
}
if (childs)
item += '\n' + childs;
response.push(item);
}
return response.join('\n');
}
alert(getChildrens(document.documentElement, 0, 3));
|
Цитата:
|
Кстати, чтобы тег base не ломал dom-дерево в ИЕ, его надо закрывать в html-стиле.
<base href="http://www.yandex.ru/"></base>
|
|