| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Загрузилась ли картинка или существует ли |
| Автор: Иль 28.3.2005, 18:08 |
| Как всегда, когда надо не могу найти. Ели после загрузки страницы или после замены какие-то картинки не загрузились или не существуют, то в каком свойстве это отрожается? Заранее спасибо. Добавлено @ 18:09 Цель - чтоб alt не портил дизайн, задам размеры или чтонить сделаю |
| Автор: Иль 28.3.2005, 19:12 |
| Или если такого нет, то буду проверять имеющиеся ширину и высоту и выставлять нужные |
| Автор: Sardar 28.3.2005, 20:59 |
| Есть конечно, свойство complete. Жаль что процентное соотношение узнать нельзя. |
| Автор: Gold Dragon 29.3.2005, 08:47 |
| а може ещё и свойство onError? |
| Автор: Иль 29.3.2005, 13:32 |
| Как проверять при загрузке понятно. А если картинка загрузилась и я меняю через JS значение SRC на несуществующее, у меня complete остается true. Можно это отследить? |
| Автор: Sardar 29.3.2005, 17:12 | ||
Хорошенько подумай что ты сказал, для верности проведи пару тестов Сменив src у любой картинки, будь то HTML элемент или Image ты сбрасываешь complete, затем как картинка полностью загрузится из кеша или из сети, complete меняется на true. |
| Автор: Иль 29.3.2005, 17:22 | ||||
Sardar, с моим уровнем подготовки, я просто не имею права задавать вопросы, не проведя с десяток тестов и в разных браузерах
Сейчас перепроверю и дам код. Но может быть и такое, что я чего-то не того - не серчайте Добавлено @ 17:27
Картинки pic111.gif не существует, в ИЕ появляется красный крест, а complete=true |
| Автор: Иль 29.3.2005, 17:33 |
| А может complete надо как-то по хитрому проверять, в какой-то момент? Я видел в поиске через функцию... |
| Автор: Aliance 29.3.2005, 20:04 | ||
Нет, это не годится. Почему бы не использовать то событие, которое специально предназначенно для этого: onabort |
| Автор: Sardar 29.3.2005, 20:05 |
| Иль извиняюсь, действительно криво... Юзаем событие onload у картинки. |
| Автор: Иль 30.3.2005, 22:46 |
| Что-то мне подсказывает, что onabort и onload надо цеплять на body или img. Верно? Можно это реализовать в функции, чтоб после смены SRC, если картинки нет что-то делать? Про setInterval понятно, а остальное что-то не представляю. Может уже был топик? Будут силы, время и желания - черканите. 100 наберу - не забуду |
| Автор: Aliance 30.3.2005, 22:53 |
| onabort - поддерживается только в теге <img> onload только начиная с 4ой версии в <img> Но для <img> они полярны, первое обозначает прерывание загрузки изображения, второе - загрузку полную его. |
| Автор: Sardar 31.3.2005, 02:11 |
| Наваял немного: http://forum.vingrad.ru/index.php?showtopic=47159 |
| Автор: Иль 1.4.2005, 11:38 | ||||
| Должен добавить об одной досадной особенности из собственного опыта. В Лисах и Мазиллах, в отличие от ИЕ, присваивание complete=true некорректно и немного опережает реальное положение вещей, что требует полюбому ставить между
Т.е. хотя complete уже true, свойства изображения в ноде обновятся с задержкой. Печально... Добавлю - касается только впервые выводимых на дисплей картинок (даже уже подкаченных скриптом!!!). |
| Автор: Иль 1.4.2005, 12:57 |
| Елки-моталки. Замотался! ИЕ тоже туда же, если просматривать не локально. Влепил 500мс - заработало. Sardar, извини, в твоем скрипте еще не разбирался - пойду. А вообще, еще идея, тестить свойство старой картинки с новым - 100% безотказно. |
| Автор: Иль 1.4.2005, 13:54 |
| Я все еще тут (пора, пора на http://forum.vingrad.ru/index.php?showtopic=47159 Упрел! Создаю объект-изображение, подгружаю в него новую картинку, проверяю на complete и только тогда в целевом изображении меняю SRC. Но это не все!!! Проверяю целевое изображение на complete и считываю нужные мне свойства в надежде получить новые значения. Нормалек, работает. Ок, сливаем бадягу в инет. М-да. Чешу злобно голову... Получилось какак-то смутно. Чем больше тайминги у setInterval, тем больше шансов застать новые значения свойств и чем загруженней браузер (многооконный) - тем меньше. Отсюда и переодические глюки перемены свойств при смене туда и обратно. Видать надо проверять изменения конкретного свойства или свойств. Теперь, побаловав дух любознательности, иду учить пример старшего товарища |
| Автор: Sardar 1.4.2005, 15:26 |
| А зачем тебе мониторить свойства картинок? Покажи код. |
| Автор: Иль 1.4.2005, 15:57 | ||
| Слава тебе господи, отпустило Sardar, а ведь все благодаря тебе, спасибо!!! Я раньше не знал и нигде онлайн не мог найти (может просто не замечал), как задавать событие на к-либо элемент в функции, а не инлайн. Даже специально везде рылся (подумывал, что такого нет). А посмотрев код в предлагаемом тобой топике сразу сообразил. Так что прошу для чайников (и их подруг
Даже обидно, как все просто. И что вы думаете! Только я (после смены SRC) посадил мою картинку на onload, которому прописал метод считывания ее размеров, так сразу все стало работать без перебоев с первого раза! И еще, та чек-функция смены SRC в твоем топике (47159) просто супер. Руки бы не дошли, а ты так все ладно сделал. Спасибо огромное. Забыл про код - да там тривиальщина, чтоб дизаин не портился. Картинка изменилась - подгоняем по ее размерам соседний элемент (эстетика, Ё-моё). Уменьшилась - обратно. Добавлено @ 15:58 Не, если интересно, я вырву код из контекста, очищу от воды и выложу... |
| Автор: Sardar 1.4.2005, 16:29 | ||||
Не нужно, это базовый JS, учится в любом учебнике, на крайняк опытом Любой обьект можно создать в некотором контексте, в котором он и будет жить, например внутри функции. Следовательно функции можно вкладывать друг в друга, при этом важно что все переменные обьявленные в функции выше продолжают быть доступными в функции ниже, даже после выхода. Запутанно?
Жмём на кнопку, видим что каждый раз запускается новый тред имеющий свой собственный контекст функции test с переменной а. А вообще в JS много чего интересного, те же геттеры/сеттеры в Мозилле |
| Автор: Aliance 1.4.2005, 16:51 | ||
А это я для кого писал: http://forum.vingrad.ru/index.php?showtopic=32350 =) |
| Автор: Иль 1.4.2005, 17:36 |
| Увы и ах, читал много раз, аголова не приняла. Только на живом примере. Aliance, Sardar, не обижайтесь, теперь я вижу, что там это есть, Но! Так, как там это написано... Не учебник же. Итак-то есть непонятки. Теперь не вопрос, но неделю назад мозги запудрились, даже не разглядел. Нужен базис для восприятия. |
| Автор: Иль 4.4.2005, 20:25 |
| Опять замечено продолжение глюка в обоих бродилках, если не использовать this. Если описывать метод, привязанный к onload, не как предложил Sardar в указанном топике (с использованием this), то опять, при первой смене картинок, указанный глюк появляется!!! Видимо без this теряется связь с еще не кэшированной, только закаченной картинкой. Добавлено @ 20:32 разбираться, правда, и делать выводы некогда - решение есть. |
| Автор: Sardar 5.4.2005, 01:13 | ||
Подробнее об этом? Что за указанный глюк? Ссылка this указывает на того кому принадлежит метод, в случае с "традиционнымйи обработчиками событий" ссылка указывает на обьект, к событию которого мы задавали функцию-обработчика. Убедись что в твоём случае this это именно то что ты думаешь(опроси{правильный ответ}: nodeType{1}, tagName{IMG}). Ссылка this указывет на обьект-картинку в нутри обработчика события, а каково его состояние(загруженно/нет) абсолютно не важно, ошибка в другом |
| Автор: Иль 5.4.2005, 07:46 | ||
Меняю SRC картинки, считываю ее высоту. Глюк заключается в том, что при первой смене SRC ее свойства меняются с большой задержкой и при считывании я получаю старые значения. |
| Автор: Aliance 5.4.2005, 15:38 |
| Кинь кусок кода где ты меняешь Src и где параметры (ширина, высота) |
| Автор: Иль 5.4.2005, 20:57 | ||
Вот проблемный код
Условие: Картинка pic2.gif выше pic1.gif Описание: Запускаем впервые в ИЕ или Лисе, кликаем по картинке и слой не меняет свою высоту. Кликаем второй раз и слой вырастает в высоту. Повторнуй опыт с тем же результатом: В Лисах под ХР достаточно нажать обновить, а в ИЕ требуется перезапуск браузера. Извините, беспроблемный код положу после - на работе аврал. |
| Автор: Aliance 5.4.2005, 21:08 |
| У IMG не заданы параметры (null), так их нельзя изменять. А как из кода выше узнать какой первый раз какой второй? Это я так понимаю в другом коде делается, да? А то иначе не правельно. В общем задай картинке ее реальные height и width и запусти заного. |
| Автор: Иль 6.4.2005, 16:28 |
| Да, так и есть, это упрощенный донельзя код чтоб показать проблему. Я немного не понял. Высоту и ширину задавать в HTML не получается - поидеи картинок много и они разные. И еще, тогда ж нельзя использовать картинки разного размера - браузер отмаштабирует новую картинку под размеры, указанные в HTML. Если это делать в JS, пробежав по коллекции после загрузки, но у изображений height и width уже есть автоматически. |
| Автор: Sardar 6.4.2005, 18:36 |
| Всё верно, картинка не успела подгрузится, а ты уже опрашиваешь её свойства. В JS всё работает паралельно(асинхронно), таймеры, загрузка картинок и т.п. Когда кликаешь по второму разу картинка уже в памяти, размеры известны, код срабатывает. Отсюда вывод: ловим событие onload, опрашиваем её своства. Ты уже так и сделал |