среда, 8 апреля 2009 г.

Ошибки 80004004 и 80020005 при выполнении appendChild в IE

Столкнулся со странной проблемой. IE версий от 6 по 8-ю выдавал ошибку 80004004 при открытии страницы, причем она совершенно нормально работала в Opera и Firefox.

На странице использовался плагин Jquery ColorPicker и расследование показало, что ошибка возникает при выполнении вставки кода диалога выбора в документ:

cal.appendTo(document.body);

Замена этого кода на

window.document.body.appendChild(tpl);

привела к тому, что ошибка заменилась на "Не удалось завершить действие. Ошибка 80020005". Гугл в конце концов вывел на обсуждение схожей проблемы. Оказалось, что подобная ошибка возникает когда скрипт пытается что-либо добавить в конец документа до окончания формирования DOM-дерева.

Решение оказалось чрезвычайно простым. Изначальный код подключения диалога выбора цвета

    $('#my-id').ColorPicker({
        "onSubmit": function(hsb, hex, rgb) {
            $('#my-id').val('#'+hex);
        },
        onBeforeShow: function () {
            $(this).ColorPickerSetColor(this.value);
        }
    })
    .bind('keyup', function(){
        $(this).ColorPickerSetColor(this.value);
    });

Был заменен на

$(window).load(function () {
    $('#my-id').ColorPicker({
        "onSubmit": function(hsb, hex, rgb) {
            $('#my-id').val('#'+hex);
        },
        onBeforeShow: function () {
            $(this).ColorPickerSetColor(this.value);
        }
    })
    .bind('keyup', function(){
        $(this).ColorPickerSetColor(this.value);
    });
});

Таким образом мораль: никогда не работайте с DOM-деревом до его построения, даже если ваш любимый браузер это позволяет.

Комментариев нет: