Показать сообщение отдельно
  #27 (permalink)  
Старый 03.06.2009, 12:11
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 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>
Ответить с цитированием