Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: preload image
 
 автор: SHAman   (23.11.2006 в 17:58)   письмо автору
 
 

Такая задача:
есть страница. На нее будут подгружаться при помощи JS изображения. Делается это при помощи скрипта:


function bigpic(newsrc)     {
var pic=new Image();
pic.src=newsrc;

var picw=pic.width;
var pich=pic.height;
div.style.width=picw;
div.style.height=pich;
}


Как видно из скрипта, нужно задать диву размеры этой картинки. На сколько я понимаю, картинка будет загружена уже когда я написал
pic.src=newsrc;
Или нет? Если нет, тогда понятно почему pic.widh и pic.height возвращают 0. Но тогда как померять ширину и высоту картинки?

ЗЫ. Самое интересное, что после первого прогона этого скрипта все нормализуется и работает как должно. Т.е. на второе нажатие высота и ширина картинки уже не будут 0.

Помогите пожалуйста...

   
 
 автор: AlexSol   (23.11.2006 в 19:32)   письмо автору
 
   для: SHAman   (23.11.2006 в 17:58)
 

pic.src=newsrc инициирует загрузку, а будет загружена по событию onLoad.

   
 
 автор: 12345   (23.11.2006 в 19:49)   письмо автору
 
   для: AlexSol   (23.11.2006 в 19:32)
 

т.е.
pic.onload=function(){alert([pic.width,pic.height])}

   
 
 автор: SHAman   (24.11.2006 в 14:15)   письмо автору
 
   для: 12345   (23.11.2006 в 19:49)
 

Спасибо, сейчас попробую...

   
 
 автор: SHAman   (24.11.2006 в 15:09)   письмо автору
 
   для: SHAman   (24.11.2006 в 14:15)
 

Не получается.... Вот мой код:

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


Блин, как только выполнилась первая строка, объект уже существует, а значит, проверка
if (pic) уже вернет true. Как мне сделать так, чтобы скрипт дожидался загрузки картинки? А не пытался определить высоту и ширину до ее загрузки?

   
 
 автор: coloboc66   (24.11.2006 в 16:04)   письмо автору
 
   для: SHAman   (24.11.2006 в 15:09)
 

Я знаю, что в РНР есть ф-ция определения размера файла, по идее аналог должен быть и в ява-скрипт. Используя такую функцию, можно заставить скрипт определять ширину и высоту картинки, только если файл имеет размер не менее заданного. Т.е. когда он уже загружен.

   
 
 автор: SHAman   (24.11.2006 в 16:13)   письмо автору
 
   для: coloboc66   (24.11.2006 в 16:04)
 

Ну, то, что определить размер картинки можно только после того, как загрузишь ее - логично. Но как определить тот момент, когда она загрузилась, чтобы начать определять размеры? И ПХП тут не при чем. В данном случае интересует JS...

   
 
 автор: coloboc66   (24.11.2006 в 16:33)   письмо автору
 
   для: SHAman   (24.11.2006 в 16:13)
 

Я конечно извиняюсь, может я невнимательно читал тему, но, насколько я понимаю, если вы помещаете картинку в ДИВ, просто не нужно для дива указывать НИКАКИХ размеров, ни стилями, ни скриптами. Его размеры автоматически будут подогнаны под размер картинки.

   
 
 автор: SHAman   (24.11.2006 в 16:39)   письмо автору
 
   для: coloboc66   (24.11.2006 в 16:33)
 

Ширину и высоту мне нужно задавать диву. Из них высчитывается позиционирование. Див потом будет вставать по середине экрана, для этого надо знать ширину высоту экрана и ширину высоту дива. А див - под размер картинки;)

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

   
 
 автор: SHAman   (24.11.2006 в 17:03)   письмо автору
 
   для: SHAman   (24.11.2006 в 16:39)
 

О! Нашел решение. Подсказали.
Надо просто делать так:


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


То бишь, нужно присваивать картинке src уже после того, как произошла ее загрузка =)

.....:(:(:(:(

Блин, теперь выводит просто ошибку. Короче: тыкаю на картинку, он говорит - ошибка. еще раз тыкаю - работает.... Че делать? Вот, короче, полный код:


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;
div.style.left=(win_x/2-picw/2);
div.style.top=(win_y+bod.clientHeight/2-pich/2);
div.style.display='inline';
}


А! Уже голова пухнет от этой картинки...:( Подсобите.

   
 
 автор: RMW   (24.11.2006 в 18:35)   письмо автору
 
   для: SHAman   (24.11.2006 в 15:09)
 

...

   
 
 автор: SHAman   (24.11.2006 в 18:53)   письмо автору
 
   для: RMW   (24.11.2006 в 18:35)
 

А что значит пост "..."???

Решение нашлось. Подсказал человечек. Вот код:


<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>


А работающий код здесь:
http://anime.insyss.ru/galery/

Всем спасибо за помощь

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования