Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   Почему рушится ИЕ (задачка на подумать) (https://javascript.ru/forum/css-html-internet-explorer/3883-pochemu-rushitsya-ie-zadachka-na-podumat.html)

Kolyaj 02.06.2009 15:56

B~Vladi,
это все понятно. Использование insertBefore вместо appendChild, если падает ИЕ -- классическое решение. Вопрос не в этом. А ответ намного более удивительный, чем вы себе представляете :)

B~Vladi 02.06.2009 16:02

Цитата:

Сообщение от Kolyaj
Вопрос не в этом.

Я знаю в чём вопрос и по этому поводу уже написал. Это для тех, кому всё же нужен вариант обхода(кроме использования ваших любимых jq, prototype ect).
Цитата:

Сообщение от Kolyaj
А ответ намного более удивительный, чем вы себе представляете

ну?!

B~Vladi 02.06.2009 16:04

Kolyaj, ты шайтан млин, тебе п книшшки писать а не на форумах сидеть с кучей ответов в голове и ждать пока какой-нить прогер попросит помощи.

B~Vladi 02.06.2009 16:05

Это кста относицца ко многим месным...

Kolyaj 02.06.2009 16:05

Цитата:

Сообщение от B~Vladi
Это для тех, кому всё же нужен вариант обхода

Проще в body скрипт переложить.

Цитата:

Сообщение от B~Vladi
кроме использования ваших любимых jq, prototype ect

Моих? :blink: Я с Prototype писал давным давно, с jQuery никогда, с ExtJS пишу только сложные интерфейсы, которые, будь моя воля, писал бы без него :) Все остальное на своих скриптах.

Цитата:

Сообщение от B~Vladi
ну?!

Завтра :)

B~Vladi 02.06.2009 16:06

Цитата:

Сообщение от Kolyaj
Проще в body скрипт переложить.

Ну путей много... не будем тормозить на ентом...
Цитата:

Сообщение от Kolyaj
Завтра

Ну йа грю же шайтан:)

Kolyaj 03.06.2009 12:11

Собственно, объяснение.

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>


B~Vladi 03.06.2009 12:32

Мда... никогда не писал и не буду его писать в своём html:)

e1f 03.06.2009 17:50

Цитата:

var head=document.documentElement.firstChild
А что именно будет этим firstChild? Часом не текстовая нода?

Kolyaj 03.06.2009 17:56

Ну этот я код у B~Vladi спер, в моей задаче он не принципиален.


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