Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Ошибки обработчика событий onError при загрузке изображений. (https://javascript.ru/forum/misc/2441-oshibki-obrabotchika-sobytijj-onerror-pri-zagruzke-izobrazhenijj.html)

avtorpc 25.12.2008 22:15

Ошибки обработчика событий onError при загрузке изображений.
 
Необходимо предзагрузить изображения для галереи.
Делаю это стандартным способом.
totalRis=10;var imge=new Array();var tekct=new Array(); 
function start(){
tekct[1]='Деньги...деньжищи...денюшшки...';
imge[1]= new Image();
imge[1].src='http://avtorpc.narod.ru/foto_gallery/00007251.jpg';
imge[1].onLoad= statusris(1);imge[1].onError=er(1);

tekct[2]='Заплати - спи споконо!';
imge[2]= new Image();
imge[2].src='http://avtorpc.narod.ru/foto_gallery/00007255.jpg';
imge[2].onLoad= statusris(2);imge[2].onError=er(2);
}
function er(nomer){
   alert("Картинка "+nomer+" не загружена");
}

<body onLoad=start()>

При добавление imge[i].onError=er(nomer); происходит следующие 1. Загрузка изображений прерывается 2. Начинает обрабатываться событие onError 3. Событие onLoad не наступает. 4. Если не вставлять обработчик событий на ошибку загрузки картинок все отрабатывает нормально. Для полноты картины хочу добавить что часть скрипта(масив картинок и описаний к нему) генерирую на PHP.
Кто подскажет почему срабатывает обработчик ошибок?

Андрей Параничев 25.12.2008 22:36

totalRis=10;var imge=new Array();var tekct=new Array(); 
function start(){
tekct[1]='Деньги...деньжищи...денюшшки...';
imge[1]= new Image();
imge[1].src='http://avtorpc.narod.ru/foto_gallery/00007251.jpg';
imge[1].onload = function() {
    statusris(1);
}
imge[1].onerror = function() {
    er(1);
}

tekct[2]='Заплати - спи споконо!';
imge[2]= new Image();
imge[2].src='http://avtorpc.narod.ru/foto_gallery/00007255.jpg';
imge[2].onload= function() {
    statusris(2);
}
imge[2].onerror= function() {
    er(2);
}
}
function er(nomer){
   alert("Картинка "+nomer+" не загружена");
}


Советую прочитать статью про обработчики событий: http://javascript.ru/start/events/intro

avtorpc 26.12.2008 00:58

Статью прочитал. Замечательная статья, Но ответа на свою проблему не нашел. Почему одновременно срабатывают два обработчика событий и onload И onerror?

Андрей Параничев 26.12.2008 01:18

Цитата:

Частая ошибка новичков

Обратите внимание - свойству присваивается именно сама функция-обработчик doSomething, а не doSomething():

document.getElementById('button').onclick = doSomething


doSomething() - это результат запуска функции, а так как вызова return в ее коде нет, то этот результат будет undefined.

Сравните это со свойством. Там - наоборот, скобки нужны:

<input type="button" id="mybutton" onclick="doSomething()"/>


Это различие легко объяснить. Дело в том, что при назначении onclick в HTML браузер автоматически создает функцию-обработчик из содержимого кавычек. Получается, что последний пример - это по сути то же самое, что:

document.getElementById('mybutton').onclick = function() {
     doSomething()  // внутри автосозданной функции
}

Конец цитаты.

avtorpc 26.12.2008 03:29

Медленно)))) Но доходит...Пасибо тебе! Остался один вопрос - если при моей ошибке возвращается значение undefined то почему функции работают? По идее они вообще не должны активироваться...

Андрей Параничев 26.12.2008 04:40

Когда вы описываете обработчик вот так:
element.onclick = somefunction();

То в момент объявления вызывается функция somefunction и обработчику присваивается лишь её результат, а не сама функция.

В данном случае верное присвоение:
element.onclick = somefunction;

Но таким способом невозможно передать параметр.

Поэтому, используется замыкание для вызова нужной функции с параметрами:
element.onclick = function() {
    somefunction(1);
}

Sergio 24.01.2009 01:33

последовательность строк в коде
 
У меня такая последовательность как в ваших кодах, не работает. Просмотрел несколько примеров в инете, там работающаяу меня последовательность такая:

imge[1]= new Image();
imge[1].onload = function() {
statusris(1);
}
imge[1].onerror = function() {
er(1);
}
imge[1].src='http://avtorpc.narod.ru/foto_gallery/00007251.jpg';


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