Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Для создаваемого массива из document.createElement('img') onload в Опере вызывается только раз (armix)
Author Message
armix
Заглянувший



Joined: 23 May 2011
Posts: 12
Карма: 1
   поощрить/наказать


PostPosted: Sun Jul 10, 2011 6:38 pm (написано за 18 минут 20 секунд)
   Post subject: Для создаваемого массива из document.createElement('img') onload в Опере вызывается только раз
Reply with quote

Всем добрых 19:10 + GMT: 03.
Постановка задачи:
"Загружаю большое количество картинок среднего размера
( кол-во картинок ~ 200; вес каждой картинки ~ 40Кб).
 Надо:
  1) отследить правильность загрузки каждой(!) картинки;
  2) отловить момент завершения загрузки всех картинок.
"
Делаю так:
Code (JavaScript): скопировать код в буфер обмена
var nimages=0;
var Images=null,nss=0;
var notloaded=0,iload=0;
function makeImages(nim)
{
  nimages=nim;
  Images=new Array();
  for(i=0;i<nimages;i++)
  {
    var oImg=document.createElement('IMG');
    idname=names[i];
    oImg.['id']=idname;
    oImg['style']['width']=...; oImg['style']['height']=...;
    oImg['onload']=onLoadComplete; oImg['onerror']=onLoadError;
    Images[i]=oImg;
   }
  iload=0; notloaded=0;
  //alert('Начинаем загрузку');
  loadImage(0);
 }

function onLoadError()
{
  delete Images[iload];
  Images[iload]=null;
  iload++; notloaded++;
  if( iload<nimages )
  {
    try{ loadImage(iload); }
    catch(e){ alert('Error: Вот ведь, блин!'+e); }
   }
  else
  {
    alert('Загрузили');
    loadComplete();
   }
 }

function onLoadComplete()
{
  iload++;
  if( iload<nmages )
  {
    try{ loadImage(iload); }
    catch(e){ alert('Вот ведь, блин!'+e); }
   }
  else
  {
    alert('Загрузили');
    loadComplete();
   }
 }

function loadImage(ni)
{
  //alert('Загружаем '+ni+'-й слайд: '+slidearray[ni]);
  slideImages[ni].src=Names[ni];
 }

function loadComplete()
{
  ...
 }
И эта схема очень хорошо работает в FireFox.
Более-менее сносно - в IE7 (правда, после нескольких перезагрузок страницы начинает выкидывать stack overflow at line: 0)
Но не работает в Опере.
В Опере обработчик onload срабатывает только один раз. (Я проверял это в DragonFly).
По слухам, эта схема не работает и в Safari. (Что деется в Safari, я ещё буду смотреть.)
Может, кто-нибудь подскажет, почему? И как с этим бороться?
P.S. При работе с этой схемой у меня появилась ещё целая пачка вопросов.
Уместно ли будет задавать их прямо здесь?
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Sun Jul 10, 2011 10:14 pm (спустя 3 часа 36 минут; написано за 25 секунд)
   Post subject:
Reply with quote

Начните с правок алгоритма.
armix wrote:
var nimages=0;
armix wrote:
iload<nmages
Back to top
View user's profile Send private message
armix
Заглянувший



Joined: 23 May 2011
Posts: 12
Карма: 1
   поощрить/наказать


PostPosted: Sun Jul 10, 2011 11:23 pm (спустя 1 час 9 минут; написано за 1 минуту 50 секунд)
   Post subject:
Reply with quote

Виноват.
В оригинале немного другие слова. Когда переписывал, допустил ошибку.
Считайте, что исправил. В оригинале эти места просмотрел особенно тщательно!
Back to top
View user's profile Send private message
armix
Заглянувший



Joined: 23 May 2011
Posts: 12
Карма: 1
   поощрить/наказать


PostPosted: Sun Jul 10, 2011 11:27 pm (спустя 3 минуты; написано за 2 минуты 57 секунд)
   Post subject:
Reply with quote

Если бы была такая ошибка, то вообще бы нигде ни разу не работало.
Ан! В двух средах работает на "ура", а в третьей - только раз.
Здесь, скорее всего, не описка, а моё непонимание системы обработки событий в Опере
(ну и не только в ней, наверное).
Back to top
View user's profile Send private message
armix
Заглянувший



Joined: 23 May 2011
Posts: 12
Карма: 1
   поощрить/наказать


PostPosted: Sun Jul 10, 2011 11:45 pm (спустя 18 минут; написано за 2 минуты 7 секунд)
   Post subject:
Reply with quote

И уж полностью для точности.
Сейчас у меня так:
Code (JavaScript): скопировать код в буфер обмена
var nimages=0;
var Images=null,nss=0;
var notloaded=0,iload=0;
function makeImages(nim)
{
  nimages=nim;
  Images=new Array();
  for(i=0;i<nimages;i++)
  {
    var oImg=document.createElement('IMG');
    idname=names[i];
    oImg.['id']=idname;
    oImg['style']['width']=200; oImg['style']['height']=200;
    oImg['onload']=onLoadComplete; oImg['onerror']=onLoadError;
    Images[i]=oImg;
   }
  iload=0; notloaded=0;
  //alert('Начинаем загрузку');
  loadImage(iload);
 }

function onLoadError()
{
  delete Images[iload];
  Images[iload]=null;
  iload++; notloaded++;
  if( iload<nimages )
  {
    try{ loadImage(iload); }
    catch(e){ alert('Error: Вот ведь, блин!\n'+e); }
   }
  else
  {
    alert('Загрузили');
    loadComplete();
   }
 }

function onLoadComplete()
{
  iload++;
  if( iload<nimages )
  {
    try{ loadImage(iload); }
    catch(e){ alert('Вот ведь, блин!\n'+e); }
   }
  else
  {
    alert('Загрузили');
    loadComplete();
   }
 }

function loadImage(ni)
{
  //alert('Загружаем '+ni+'-й слайд: '+Names[ni]);
  Images[ni].src=Names[ni];
 }

function loadComplete()
{
  ...
 }
Эффект круговой.
С какой стороны ни посмотри, а всё тот же радиус!
Back to top
View user's profile Send private message
armix
Заглянувший



Joined: 23 May 2011
Posts: 12
Карма: 1
   поощрить/наказать


PostPosted: Wed Jul 20, 2011 12:06 pm (спустя 9 дней 12 часов 21 минуту; написано за 6 минут 45 секунд)
   Post subject:
Reply with quote

Всем добрый день.
Приношу извинения за ложную тревогу. Приведённая схема прекрасно работает во всех браузерах.
Ошибка у меня была в "левом" обработчике onsubmit, который в Опере и Safari вызывал перерисовку страницы.
По идее, тему можно закрыть, но я хотел бы задать ещё один вопрос:
"Можно ли сохранить загруженный массив элементов IMG на всё время сессии,
чтобы при перегрузке страницы не приходилось заново перегружать картинки?".
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Wed Jul 20, 2011 3:58 pm (спустя 3 часа 52 минуты; написано за 1 минуту 45 секунд)
   Post subject:
Reply with quote

armix,
нельзя. (По идее браузер их закэшировать должен и тогда, соответственно, при следующей загрузке страницы массив image'ов создастся быстрее.)
Back to top
View user's profile Send private message Send e-mail
armix
Заглянувший



Joined: 23 May 2011
Posts: 12
Карма: 1
   поощрить/наказать


PostPosted: Thu Jul 21, 2011 2:26 pm (спустя 22 часа 27 минут; написано за 2 минуты 8 секунд)
   Post subject:
Reply with quote

Спасибо.
В принципе есть вариант передавать изображения как data:image.
Тогда их, наверное, удастся сохранить на время перезагрузки.
Но, кажется, есть куча ограничений на использование этого источника.
Изучаю вопрос.
Данную тему, наверное, закрыть можно?
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 83
   поощрить/наказать


PostPosted: Thu Jul 21, 2011 2:42 pm (спустя 15 минут)
   Post subject:
Reply with quote


М

Quote:
Данную тему, наверное, закрыть можно?
Не вопрос. (-:

Тема закрыта.
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   This topic is locked: you cannot edit posts or make replies. All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML