| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Как убедиться в полной загрузке картинки? |
| Автор: SHAmanovi4 24.11.2006, 15:31 | ||
| Люди, помогите. Не знаю как решить задачку: По определенному событию начинаю грузить картинку. Мне нужно узнать ширину и высоту этой картинки. Вот код:
Проблема в том, что ширина и высота картинки так и не определяются. Что-то я не то делаю. Как убедиться в том, что картинка загружена полностью и только тогда брать ширину и высоту? Сейчас у меня и то и то становится undefined Помогите пожалуйста |
| Автор: griker 24.11.2006, 15:41 | ||
|
| Автор: SHAmanovi4 24.11.2006, 15:44 |
| Неее... У меня картинки пока что нет. Т.е. хтмл-кода вообще нет. Он генерируется после загрузки картинки. Т.е. у меня, грубо говоря, пустая страница. А когда я запускаю скрипт, начинает догружаться картинка. Мне, скажем, нужно ее поместить в div. Для этого мне нужно задать диву размеры, равные размерам картинки. Собственно вот. Так как вы предложили - не подходит. Картинка выводится гораздо позже того, как мне нужны ширина и высота. |
| Автор: SelenIT 24.11.2006, 16:08 |
| SHAmanovi4, так перенесите второй alert и все, что нуждается в переменных picw, pich внутрь той функции, которая onload объекта Image(). Скрипт же не становится на паузу от самого факта назначения обрабочика... |
| Автор: 12345c 24.11.2006, 16:14 | ||||||
Добавлено @ 16:17 Лучше ww=setInterval(...), а когда определится a.width&&a.height, стереть: cleaRInterval(ww); Добавлено @ 16:19 Нет, всё понятно, вот так стабильно работает:
|
| Автор: SHAmanovi4 24.11.2006, 16:58 | ||
| О! Спасибо большое! Заработало! Оказывается, нужно было присваивать src уже после того, как наступил onload! Крутотень... век живи - век учись. Спасибо большое. ...... Блин! Теперь вот какое дело: он при первом клике сообщает об ошибке. Только на второй делает все как полагается... Вот полный листинг скрипта... не хотел выкладывать, но, похоже, выбора нет.
|
| Автор: SHAmanovi4 24.11.2006, 17:39 |
| А если я запихаю остатки своей функции (смотри код в моем посте выше), то оно будет работать чтоли... ща попробую... |
| Автор: 12345c 24.11.2006, 17:48 |
| 1) function bigpic(newsrc, title) { var div = d.getElementById('bigpic'); - даст ошибку в FF из-за 2 переменных с одинаковым имененем (он считает, что ид - это переменная); 2) возможно, на больших картинках pic.onload=function() {picw=pic.width; pich=pic.height;} не сработает (были такие проблемы, правда, при прорисовке картинки), и тогда надо вставить задержку. |
| Автор: SHAmanovi4 24.11.2006, 18:02 | ||
Во блин! Тупизм... ладно, исправлю. Это не долго.... Господа, пожааааалуйста! Напишите работающий пример! |
| Автор: 12345c 24.11.2006, 18:13 | ||
Действительно, проверил эту программу на локальном хосте в IE - успевает, а в FF - нет. Придётся переделать с задержками. Минут через 5.
|
| Автор: SHAmanovi4 24.11.2006, 18:38 |
| Во! ОТЛИЧНО! http://anime.insyss.ru/galery просто хочу нормально чтобы картинки открывались в галерее. Я написал галерею на Perl, хочу ее в свободное плавание запустить. Вот готовлю. Спасибо еще раз. |
| Автор: SelenIT 24.11.2006, 18:45 |
| 12345c, а в чем все же преимущество периодического вызова по таймауту однократному вызову по Onload? |
| Автор: SHAmanovi4 24.11.2006, 18:49 |
| Видимо, в том, что onload проскакивал. Попробуйте сделать по onload и по таймауту. По onload мне предлагали делать все. И у меня не получалось. А по таймауту получилось. Можете посмотреть по моей ссылке результат. сам понимаю что по таймауту не оч хорошо получается - функция висит в памяти. Но что пделать, если так надежнее? |
| Автор: SelenIT 24.11.2006, 18:54 | ||
SHAmanovi4, не знаю, я поэкспериментировал с Вашим кодом с onload, только тупо перенес в него весь код за исключением присвоения src:
И никаких проблем в FF не увидел, ни на быстрой локальной загрузке, ни на медленной удаленной. Предлагаю дождаться ответа 12345c... |
| Автор: 12345c 24.11.2006, 19:00 | ||
| (Тот же самый эффект значительно проще, без скриптов, получить, если сгенерировать отцентрированную (по горизонтали) таблицу неопределённой ширины и высоты, вставленную в таблицу шириной и высотой 100%, имеющую absolute. Картинка тогда проявится только после окончания загрузки (т.к. в таблице), а центровку не надо будет вычислять.) Примерно:
Внешняя таблица без фона не мешает делать клики, что иллюстрируется ссылкой. ...Хотя нет, мешает. |
| Автор: SelenIT 24.11.2006, 19:08 |
| Имхо, "значительно проще без скриптов" из скрипта все же не получится ;) |
| Автор: 12345c 24.11.2006, 19:32 | ||
Я тестировал на 1.07, там FF (в моей версии) не успевал выдать правильные размеры, давал (0,0). И, видимо, это где угодно могло случиться, поэтому проверка по таймауту страхует неуспевание. Кстати, без таймаута уже через несколько операторов FF давал правильные размеры, но на это надеяться, конечно, нельзя. |
| Автор: SelenIT 24.11.2006, 19:34 | ||||
12345c, я правильно понимаю, такая беда была с этим вариантом?
А если его заменить на такой
|
| Автор: 12345c 25.11.2006, 00:56 |
| Скорее всего, разницы не будет, потому что стоило взять в FF a.width чуть позже без задержек по tomeout, как становилось не 0, а нужное число. |
| Автор: SHAmanovi4 30.11.2006, 18:24 | ||
| как это выглядит сейчас: http://anime.insyss.ru/galery/ И вот какой ща скрипт:
На самом деле, я уже на грани отчаяния. Я логику понимаю, следую за ней и не вижу ошибки. ПОЧЕМУ |