Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Интерактивная загрузка картинок, дефинитивный ответ 
:(
    Опции темы
Sardar
Дата 31.3.2005, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 16
Всего: 317



Часто стал всплывать вопрос: как интерактивно загрузить картинку, при этом показать её только когда она полностью загрузится.

Внимательно рассмотрим задачу, выделим три момента:
  • загрузка картинки
  • показ когда она загрузилась
  • разного рода "заставки"(сообщения "loading..." и т.п.) в момент загруки

Сделаем некий API у картинок, что бы было удобней. Тут сразу упрётся ИЕ рогом, оворя что Image.prototype менять нельзя. Порешаем вторым вызовом проверки:
Код
/** проверяем есть ли требуемый метод у картинки, если надо устанавливаем */
function checkChangeAPIAvaible(img) {
  if(!img.changeSrc) img.changeSrc=changeSrcH;
}

/** реализация метода  changeSrc */
function changeSrcH(src) {
  if(src==null) { //если параметров не было, то покажи предидущую удачно загруженную картинку
    if(this.backSrc) this.src=this.backSrc;
    return;
  }
  if(this.complete) this.backSrc=this.src; //если предидущая картинка была удачно загруженна, то сохрани адрес на случай возврата
  if(!this.tempLoadImage) { //обьект Image который загрузит наш файл
     this.tempLoadImage=new Image();
     this.tempLoadImage.onload=changeSrcOL; //как только картинка загрузится
     this.tempLoadImage.parentImage=this; //ссылка на предка, понадобится в обработчике onload

     this.msg=createMessage("Loading...", this); // заморочки, просто сообщение "Loading..."
  }
  this.msg.show();
  this.tempLoadImage.src=src;
}

/** обработчик события  onload у картинки, меняем пути предка  */
function changeSrcOL() {
  this.parentImage.src=this.src;
  this.parentImage.msg.hidde();  //скрываем заморочки если использовались =)
}


Как видим код предельно прост. Используем например так:
Код
<script type="text/javascript">
function testbut(src) {
  var im=document.getElementById("test");
  checkChangeAPIAvaible(im); //проверка что changeSrc существует
  im.changeSrc(src); //собстна юзаем всё что писали выше
}
</script>
<img id="test" src="test.jpg" /><br />
<button onclick="testbut('test2.jpg');">Вторая</button><button onclick="testbut('nothing.jpg');">Не существующая</button><button onclick="testbut(null);">Предидущая удачная</button>


Само сообщение о загрузке реализовал просто:
Код
<style type="text/css">
.message {
  font-family: Verdana;
  font-size: 8px;
  border: 1px solid black;
  background-color: #eff0f9;
  
  position: absolute;
  width: auto;
  height: auto;
}
</style>

<script type="text/javascript">
function getPosition(obj) {
  var x=0, y=0;
  while(obj) {
    x+=obj.offsetLeft;
    y+=obj.offsetTop;
    obj=obj.offsetParent;
  }
  return {x: x, y:y};
}

function createMessage(txt, obj) {
  var m=document.createElement("DIV"); //создали
  m.className="message";
  m.innerHTML=txt;
  document.body.appendChild(m);
  if(m.offsetWidth>obj.width) m.style.width=obj.width; //что бы за картинку не вылезло
  return { //возвращаем обьект
    target:m,
    prnt: obj,
    hidde:function(){this.target.style.visibility="hidden";},
    show:function(){
      var pos=getPosition(this.prnt);
      this.target.style.left=pos.x;
      this.target.style.top=pos.y;
      this.target.style.visibility="visible";
    }
  };
}</script>


Здесь можно не только увидеть но и покликать: http://files.vingrad.ru/Sardar/ImageLoad.htm smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Aliance
Дата 31.3.2005, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 6
Всего: 137



smile
Вау, Avril Lavigne smile Красивые фотки.

А третия кнопка у меня ничего не делает smile
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 31.3.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 16
Всего: 317



Aliance не совсем, эта кнопка устанавливает последнюю удачно загруженную картинку. Жём на первую кнопку, картинка поменялась, жмём на третью, картинка вернулась. Жмём первую, а затем вторую(не существующая), последная удачная теперь картинка от первой кнопки.
Собстна это не нужно, просто реализовал smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Aliance
Дата 31.3.2005, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 6
Всего: 137



Цитата(Sardar @ 31.3.2005, 17:31)
Жём на первую кнопку, картинка поменялась, жмём на третью, картинка вернулась.

Вот небыло этого у мен почему-то...))
PM MAIL WWW ICQ Skype   Вверх
Иль
Дата 1.4.2005, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Я не понял, объясните пожалуйста.
Код
this.tempLoadImage.onload=changeSrcOL; //как только картинка загрузится
 

Т.е. событию onload этой картинки мы назначаем метод-обработчик смены SCR у родителя, описанный функцией changeSrcOL?

И еще тут не понял, зачем?
Код

this.tempLoadImage.parentImage=this; //ссылка на предка, понадобится в обработчике onload
 

Как эта ссылка понадобится в onload, ведь в changeSrcOL() "говорится" о ".parentImage"??
А так боле-менее понятно smile


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 1.4.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 16
Всего: 317



Код приведённый выше работает с любой картинок на странице. У каждой картинки с которой работаетм мы создаём обьект Image(в коде this.tempLoadImage), который загрузит картинку из сети(кстати таймаут выставить я забыл, вдруг у юзера коннект оборвётся...)

Как только картинка загрузится мы должны показать её юзеру, для этого отлавливаем событие onload.
Цитата
Т.е. событию onload этой картинки мы назначаем метод-обработчик смены SCR у родителя, описанный функцией changeSrcOL?

Да.


Цитата
Как эта ссылка понадобится в onload, ведь в changeSrcOL() "говорится" о ".parentImage"??

Собтна ссылку parentImage мы и устанавливаем в ручную, дабы она потом была доступна из обработчика onload. Ссылка this в обработчике указывает не на элемент img, а на обьект Image, который загружал нашу картинку.


Код по вкусу можно доработать, например опрос текущего статуса(загрузка, отображение).


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 1.4.2005, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Просто супер, особенно когда немного понимаешь smile

Цитата
Код по вкусу можно доработать, например...
отображение - это как. В смысле каким свойством это опрашивается

Sardar, а что вообще бывает и конкретно здесь будет если
Цитата
у юзера коннект оборвётся...
Скрипт браузер подвесит или что?

Я тут разбирался с setInterval и, ненароком, такое сделал smile!... Называется навреди посетитель своего сайта. Обе бродилки висли напрочь, приходилось перезапускать, сообщения об ошибках в Майкрософт и Геко отправлять... smile
Не помогло даже предупреждение ИЕ, что данный скрипт тормозит работу.
А что, вот полез посетитиль какие не надо запросы отсылать на сервер, а ты ему: "Нате, отдохните". Да еще, для затравки, вывести типа: "Начинаем форматировать ваш системный диск" smile. Хотя не хорошо все это. smile


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 1.4.2005, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 16
Всего: 317



Цитата
Скрипт браузер подвесит или что?

Нет ничего не будет, в этом и проблема. Юзеру не приятно видеть мессадж "Loading..." не подающий никаких признаков жизни. Если ставим таймаут на 1 минуту, то после этой паузы можно спросить у юзера, мол либо коннект либо сервак упал, попытатся снова или бросить всё smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 10.5.2005, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Sardar, вот ты юзаешь свойство complete. А ты учел в своем коде мерзкое отношение Гекоподобных к этому свойству, тестил ли свой код в Мозиле с несуществующими изображениями? Не вижу в скрипте обхода этого глюка.
Цитата(Sardar @ 31.3.2005, 02:04)
if(this.complete) this.backSrc=this.src; //если предидущая картинка была удачно загруженна,

В Геко так нельзя, они черезчур многозадачны и продвинуты (не в ту сторону). Если прописать не существующий адрес не существующей картинки уже complete=true. Вообще при создании объекта a=new Image() в этих браузерах сразу coplete=true. Ну разве, что если присвоить src пустое значение "". С createElement такая же ситуация
Как быть?

Хоть возник такой вопрос, еще раз скажу спасибо за труд и привиденный код, который когда-то сильно продвинул меня в понимании JS (... + позже, тк сегодня уже плюсовал smile)

Это сообщение отредактировал(а) Иль - 10.5.2005, 15:52


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Иль
Дата 10.5.2005, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Ребята, если кто будет тестить свойство complete, не забывайте после смены src ставить, например, пустой alert("") (для Геко с кавычками). Это сымитирует задержку интернета, иначе при смене src на src существующего изображения можно поймать старое значение complete (многозадачность - браузер тратит время на заказчу и прорисовку). Даже используя onload такое может быть (хотя с onload только ИЕ может так глюкануть)

Это сообщение отредактировал(а) Иль - 10.5.2005, 15:08


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Иль
Дата 10.5.2005, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



В догонку.
Однако, что получается:
1. С замечательным событием onerror Gecko нам руки пообрубал (лень наверно кому-то реализовывать для людей, как в ИЕ)
2. complete тоже как фикция или заглушка реализован (чую корни проблемы из одного источника с onerror)

И что получается! Надежда только на внимание составителя сайта? За что боролись, на то и напоролись.
У меня, конечно, мало опыта в этом вопросе, поэтому надеюсь, что я ошибаюсь или чего не знаю.

Это сообщение отредактировал(а) Иль - 10.5.2005, 14:40


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Sardar
Дата 11.5.2005, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 16
Всего: 317



Цитата
тестил ли свой код в Мозиле с несуществующими изображениями?

Да тестил, свойство работает правильно. Но ты прав, нужно "некоторое время", для того что бы оно обновилось после смены src.

Что ты конкретно делаешь? Открой отдельный топик, выложи код или дай линк на страницу, посмотрим, подумаем.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Иль
Дата 13.6.2005, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



Добавлю для завершонности темы из другого топика. Sardar заметил, что в Gecko все работает правильно и onerror и complete, но только если работать через сеть, а не тестить локально на своем ПК.


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Opik
Дата 13.6.2005, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: нет
Всего: 55



PM MAIL Skype   Вверх
Иль
Дата 13.6.2005, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 544
Регистрация: 3.3.2005
Где: Москва

Репутация: нет
Всего: 14



ну наверно места нехватает на сервере smile


--------------------
Ты виндусятник?... А я да. smile
PM MAIL ICQ Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Здесь публикуют скрипты, которые уже проверены в обсуждениях других тем (при этом полезно поставить ссылки на все смежные обсуждения) или переносятся кем-либо из модераторов по просьбе участников, если видно, что в результате обсуждения темы был написан полезный или интересный скрипт. Третий возможный вариант - участник форума публикует скрипт, заведомо известный как полезный и эффективный, для, возможно, небольшой доработки и обсуждения.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Наши скрипты | Следующая тема »


 




[ Время генерации скрипта: 0.1019 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.