Загрузка HTML-изображения вызывает ошибку?

У меня есть html-изображение, помеченное следующим образом

   <image src = 'image.png' onerror = "handleError(this)" onload = "handleLoad(this)">

    function handleError(n){
        getFirstChild(n.parentNode).style.display = '',n.style.display = 'none';
    }

    function handleLoad(n){
        getFirstChild(n.parentNode).style.display = 'none',n.style.display = '';
    }

У меня есть отдельная функция getFirstChild, но она не имеет ничего общего со следующей проблемой.

По сути, в IE 11 происходит то, что обработчик onLoad запускается, и моя функция правильно настраивает дисплеи, однако сразу после запуска onload также запускается onerror и перезаписывает то, что сделала функция handleLoad. К сожалению, это приложение поддерживается только в браузере IE, но это происходит только в версии IE11, в IE10 это работает как положено.

Я не уверен, как может срабатывать onLoad, а затем onError срабатывает сразу после того, как onLoad находит изображение из src.

ВТОРОЕ РЕДАКТИРОВАНИЕ

Как видно из комментария ниже, я не могу воспроизвести это в jfiddle в IE11. Это может быть из-за разных вещей, которые мой код пытается сделать одновременно, но есть ли способ понять, почему сработал обработчик onerror? Я попытался распечатать src элемента изображения, но это, похоже, не проблема, поскольку и onError, и onLoad возвращают один и тот же src, и изображение явно присутствует. Во всяком случае, я могу видеть, что вызывает срабатывание onError?


person ZeRaTuL_jF    schedule 18.02.2015    source источник
comment
Не уверен, что это проблема, но вам не хватает кавычек вокруг ваших обработчиков внутри тега изображения.   -  person AWolf    schedule 18.02.2015
comment
А, хорошо, без проблем. Я не смог получить описанную вами ошибку в IE11 (Win8) с этим jsFiddle.   -  person AWolf    schedule 18.02.2015
comment
@AWolf Я обновлю вопрос со структурой формата HTML, когда у меня будет возможность.   -  person ZeRaTuL_jF    schedule 18.02.2015
comment
Вы можете использовать инструменты разработчика IE, установить точку останова и пройти через нее. Очистите консоль при посещении страницы, затем обновите и снова проверьте консоль. Может там ошибка...   -  person Tim    schedule 18.02.2015
comment
@Tim Я использовал инструменты разработчика IE, но в консоли не возникает ошибок. Я даже мониторил сеть и все ответы приходят без ошибок. Я не уверен, где еще искать.   -  person ZeRaTuL_jF    schedule 18.02.2015
comment
Вам не нужно передавать это, оно будет доступно для функции.   -  person Chris McCowan    schedule 19.09.2017


Ответы (1)


Событие window.onload используется программистами для запуска своих веб-приложений. IE поддерживает очень удобный (но нестандартный) атрибут тега: defer. Наличие этого атрибута указывает IE отложить загрузку скрипта до тех пор, пока не загрузится DOM. Однако это работает только для внешних скриптов. Еще одна важная вещь, которую следует отметить, это то, что этот атрибут нельзя установить с помощью скрипта. Это означает, что вы не можете создать скрипт с помощью методов DOM и установить атрибут defer — он будет проигнорирован.

Используя удобный атрибут defer, мы можем создать мини-скрипт, который вызывает наш обработчик загрузки:

<script defer src="ie_onload.js" type="text/javascript"></script>

Содержимое этого внешнего скрипта будет состоять из одной строки кода для вызова нашего обработчика событий onload:

init();
function init() {
// quit if this function has already been called
if (arguments.callee.done) return;

// flag this function so we don't do the same thing twice
arguments.callee.done = true;

// do stuff
};

как мы видим, есть много проблем, связанных с использованием обработчика событий DOM в IE, поэтому условная компиляция может быть еще одним вариантом для проблемы OP. ИМХО, вам нужно перейти по этой ссылке:

http://dean.edwards.name/weblog/2005/09/busted/
person SUMIT KUMAR SINGH    schedule 18.02.2015
comment
Этот ответ не имеет никакого отношения к вопросу. - person rhgb; 22.02.2017