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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как убедиться в полной загрузке картинки? картинка подгружается через JS 
:(
    Опции темы
SHAmanovi4
  Дата 24.11.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Люди, помогите. Не знаю как решить задачку:

По определенному событию начинаю грузить картинку. Мне нужно узнать ширину и высоту этой картинки.

Вот код:
Код

var pic=new Image();
pic.src=newsrc;    //инициация загрузки большой картинки
var picw, pich;    //инициация переменных высоты и ширины большой картинки
pic.onload=function() {picw=pic.width; pich=pic.height; alert('картинка загрузилась');}    //определение момента загрузки большой картинки
alert(picw+', '+pich);    //вывод ширины и высоты большой картинки после ее загрузки.


Проблема в том, что ширина и высота картинки так и не определяются. Что-то я не то делаю. Как убедиться в том, что картинка загружена полностью и только тогда брать ширину и высоту? Сейчас у меня и то и то становится undefined smile 

Помогите пожалуйста
PM WWW ICQ   Вверх
griker
Дата 24.11.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MDMA
**


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

Репутация: 1
Всего: 8



Код

<img src="images.jpg" onLoad="alert('Width: ' + this.width + ' Height: ' + this.height);">



--------------------
I don't respect police
PM MAIL   Вверх
SHAmanovi4
Дата 24.11.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Неее... У меня картинки пока что нет. Т.е. хтмл-кода вообще нет. Он генерируется после загрузки картинки. Т.е. у меня, грубо говоря, пустая страница. А когда я запускаю скрипт, начинает догружаться картинка. Мне, скажем, нужно ее поместить в div. Для этого мне нужно задать диву размеры, равные размерам картинки. Собственно вот. Так как вы предложили - не подходит. Картинка выводится гораздо позже того, как мне нужны ширина и высота.
PM WWW ICQ   Вверх
SelenIT
Дата 24.11.2006, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



SHAmanovi4, так перенесите второй alert и все, что нуждается в переменных picw, pich внутрь той функции, которая onload объекта Image(). Скрипт же не становится на паузу от самого факта назначения обрабочика...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
12345c
Дата 24.11.2006, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


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

Репутация: 57
Всего: 101



Код
a=new Image();
a.src='snow21.gif'
a.onload=function(){alert([a.width,a.height]);}
Это как-то нестабильно работало в IE, поэтому нормально выводится так:

Код
<script>
a=new Image();
a.src='snow21.gif'</script>
<body onload="setTimeout(&quot;if(a.width&&a.height)document.getElementById('d1').innerHTML=a.width+' '+a.height&quot;,999)">
<div id=d1></div>


Добавлено @ 16:17 
Лучше ww=setInterval(...), а когда определится a.width&&a.height, стереть: cleaRInterval(ww);

Добавлено @ 16:19 
Нет, всё понятно, вот так стабильно работает:
Код
a=new Image();
a.onload=function(){alert([a.width,a.height]);}
a.src='snow21.gif'


Это сообщение отредактировал(а) 12345c - 24.11.2006, 16:21
PM WWW   Вверх
SHAmanovi4
Дата 24.11.2006, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



О! Спасибо большое! Заработало! Оказывается, нужно было присваивать src уже после того, как наступил onload! Крутотень... век живи - век учись. Спасибо большое. smile 


......
Блин! Теперь вот какое дело: он при первом клике сообщает об ошибке. Только на второй делает все как полагается...smile 
Вот полный листинг скрипта... не хотел выкладывать, но, похоже, выбора нет.

Код

var d=document;
function bigpic(newsrc, title)    {
var div = d.getElementById('bigpic');

var pic=new Image();
var picw, pich;    //инициация переменных высоты и ширины большой картинки
pic.onload=function() {picw=pic.width; pich=pic.height;}    //определение момента загрузки большой картинки
pic.src=newsrc;    //инициация загрузки большой картинки


var bod=d.getElementById('body');
var x = d.getElementById('close');

var win_x=bod.clientWidth;
var win_y=bod.scrollTop;

div.style.width=picw;
div.style.height=pich;


var divc=div.innerHTML;
var newtext='<span id=close onclick="closepic();" style="float: right;">[X]</span><div id=bigpic_tit>'+title+'</div><img src='+newsrc+' id=pic />';
div.innerHTML=newtext;
/*if (x)    {x.style.width=picw;}*/
div.style.left=(win_x/2-picw/2);
div.style.top=(win_y+bod.clientHeight/2-pich/2);
div.style.display='inline';
}


Это сообщение отредактировал(а) SHAmanovi4 - 24.11.2006, 17:05
PM WWW ICQ   Вверх
SelenIT
Дата 24.11.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



Цитата(SHAmanovi4 @  24.11.2006,  16:58 Найти цитируемый пост)
нужно было присваивать src уже после того, как наступил onload

Поправочка: не после того, как наступил, а после того, как для него был назначен обработчик. Именно чтобы иметь гарантию того, что onload не успеет "проскочить" необработанным...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
SHAmanovi4
Дата 24.11.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А если я запихаю остатки своей функции (смотри код в моем посте выше), то оно будет работать чтоли... ща попробую...
PM WWW ICQ   Вверх
12345c
Дата 24.11.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


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

Репутация: 57
Всего: 101



1) function bigpic(newsrc, title)    {
var div = d.getElementById('bigpic'); - даст ошибку в FF из-за 2 переменных с одинаковым имененем (он считает, что ид - это переменная);

2) возможно, на больших картинках pic.onload=function() {picw=pic.width; pich=pic.height;} не сработает (были такие проблемы, правда, при прорисовке картинки), и тогда надо вставить задержку.
PM WWW   Вверх
SHAmanovi4
Дата 24.11.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(12345c @  24.11.2006,  17:48 Найти цитируемый пост)
var div = d.getElementById('bigpic'); - даст ошибку в FF из-за 2 переменных с одинаковым имененем (он считает, что ид - это переменная);

Во блин! Тупизм... ладно, исправлю. Это не долго....

Господа, пожааааалуйста! Напишите работающий пример! smile  Я в упор не понимаю почему у меня программа идет дальше, не дождавшись выполнения того, что в onload...smile
PM WWW ICQ   Вверх
12345c
Дата 24.11.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


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

Репутация: 57
Всего: 101



Действительно, проверил эту программу на локальном хосте в IE - успевает, а в FF - нет. Придётся переделать с задержками. Минут через 5.
Код
<script>d=document;closepic=function(){alert(0);}
pic=new Image();  //onload нет надобности задавать, признак !pic.width||!pic.height хорошо работает
function bigpic(newsrc, title)    {
  var div1 = d.getElementById('d1');
  if(newsrc)pic.src=newsrc;    //загрузка картинки или продолжение после ожидания
  if(!pic.width||!pic.height){setTimeout('bigpic(0,"'+title+'");',10);return;}

  var picw, pich;    //инициация переменных высоты и ширины большой картинки
  picw=pic.width;pich=pic.height;
  var bod=d.body;   //var x = d.getElementById('close');
  var win_x=bod.clientWidth;
  var win_y=bod.scrollTop;
  div1.style.width=picw;div1.style.height=pich;
  var divc=div1.innerHTML;
  var newtext='<span id=close onclick="closepic();" style="float: right;">[X]</span><div id=bigpic_tit>'+title+'</div><img src='+newsrc+' id=pic1><br>'+pic.width+' '+pich;
  div1.innerHTML=newtext;   /*if (x)    {x.style.width=picw;}*/
  div1.style.left=(win_x/2-picw/2);
  div1.style.top=(win_y+bod.clientHeight/2-pich/2);
}</script>
<body><a href=# onclick=bigpic('snow.gif','snowwww');return!1>показать картинку</a><br><div id=d1 style="position:absolute;border:1px solid #999">222</div>
(то, что див не обрамляет рисунок, как задумано - проблема исходного кода smile )

Это сообщение отредактировал(а) 12345c - 24.11.2006, 18:37
PM WWW   Вверх
SHAmanovi4
Дата 24.11.2006, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Во! ОТЛИЧНО! smile Спасибо огромное за оперативность и полноту! Это будет использоваться здесь:

http://anime.insyss.ru/galery

просто хочу нормально чтобы картинки открывались в галерее. Я написал галерею на Perl, хочу ее в свободное плавание запустить. Вот готовлю.

Спасибо еще раз.
PM WWW ICQ   Вверх
SelenIT
Дата 24.11.2006, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



12345c, а в чем все же преимущество периодического вызова по таймауту однократному вызову по Onload?


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
SHAmanovi4
Дата 24.11.2006, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Видимо, в том, что onload проскакивал. Попробуйте сделать по onload и по таймауту. По onload мне предлагали делать все. И у меня не получалось. А по таймауту получилось. Можете посмотреть по моей ссылке результат.

сам понимаю что по таймауту не оч хорошо получается - функция висит в памяти. Но что пделать, если так надежнее?
PM WWW ICQ   Вверх
SelenIT
Дата 24.11.2006, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 49
Всего: 401



SHAmanovi4, не знаю, я поэкспериментировал с Вашим кодом с onload, только тупо перенес в него весь код за исключением присвоения src:
Код

var d=document;
function bigpic(newsrc, title)    {
var div = d.getElementById('bigpic');
var pic=new Image();
var picw, pich;    //инициация переменных высоты и ширины большой картинки
pic.onload=function() { // назначение действий, которые будут выполнены после загрузки...
   picw=pic.width; pich=pic.height;
   alert(picw,pich)
   var bod=d.body;
   var x = d.getElementById('close');
   var win_x=bod.clientWidth;
   var win_y=bod.scrollTop;
   div.style.width=picw;
   div.style.height=pich;
   var divc=div.innerHTML;
   var newtext='<span id=close onclick="closepic();" style="float: right;">[X]</span><div    

id=bigpic_tit>'+title+'</div><img src='+newsrc+' id=pic />';
   div.innerHTML=newtext;
   /*if (x)    {x.style.width=picw;}*/
   div.style.left=(win_x/2-picw/2);
   div.style.top=(win_y+bod.clientHeight/2-pich/2);
   div.style.display='inline';
}
pic.src=newsrc;    //...и инициация этой самой загрузки загрузки
}

И никаких проблем в FF не увидел, ни на быстрой локальной загрузке, ни на медленной удаленной. Предлагаю дождаться ответа 12345c...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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