Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Цитата
А если картинка загрузилась и я меняю через JS значение SCR на несуществующее, у меня complete остается true.
Можно это отследить?

Хорошенько подумай что ты сказал, для верности проведи пару тестов smile

Сменив src у любой картинки, будь то HTML элемент или Image ты сбрасываешь complete, затем как картинка полностью загрузится из кеша или из сети, complete меняется на true.

Автор: Иль 29.3.2005, 17:22
Sardar, с моим уровнем подготовки, я просто не имею права задавать вопросы, не проведя с десяток тестов и в разных браузерах
Цитата
Что бы не нарушить мир и покой, прежде чем задать новый вопрос

Сейчас перепроверю и дам код.
Но может быть и такое, что я чего-то не того - не серчайте
Добавлено @ 17:27
Код

<html><head></head>
<body>
<img src="pic1.gif" onClick="this.src = 'pic111.gif';alert(this.complete)">
</body></html>

Картинки pic111.gif не существует, в ИЕ появляется красный крест, а complete=true

Автор: Иль 29.3.2005, 17:33
А может complete надо как-то по хитрому проверять, в какой-то момент?
Я видел в поиске через функцию...

Автор: Aliance 29.3.2005, 20:04
Цитата(Red @ 29.3.2005, 08:47)
а може ещё и свойство onError?

Нет, это не годится.
Почему бы не использовать то событие, которое специально предназначенно для этого: onabort

Автор: Sardar 29.3.2005, 20:05
Иль извиняюсь, действительно криво... smile

Юзаем событие onload у картинки.

Автор: Иль 30.3.2005, 22:46
Что-то мне подсказывает, что onabort и onload надо цеплять на body или img. Верно?

Можно это реализовать в функции, чтоб после смены SRC, если картинки нет что-то делать?
Про setInterval понятно, а остальное что-то не представляю.
Может уже был топик?
Будут силы, время и желания - черканите.
100 наберу - не забуду smile

Автор: 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 некорректно и немного опережает реальное положение вещей, что требует полюбому ставить между
Код
img.src="значение";
и считыванием свойства
Код
a=img.style.свойство;
задержку как минимум в 6мс и выше (в зависимости от загрузки системы).
Т.е. хотя complete уже true, свойства изображения в ноде обновятся с задержкой.
Печально... smile

Добавлю - касается только впервые выводимых на дисплей картинок (даже уже подкаченных скриптом!!!).

Автор: Иль 1.4.2005, 12:57
Елки-моталки. Замотался!
ИЕ тоже туда же, если просматривать не локально. Влепил 500мс - заработало.

Sardar, извини, в твоем скрипте еще не разбирался - пойду.
А вообще, еще идея, тестить свойство старой картинки с новым - 100% безотказно.

Автор: Иль 1.4.2005, 13:54
Я все еще тут (пора, пора на http://forum.vingrad.ru/index.php?showtopic=47159 smile )

Упрел!

Создаю объект-изображение, подгружаю в него новую картинку, проверяю на complete и только тогда в целевом изображении меняю SRC.
Но это не все!!! Проверяю целевое изображение на complete и считываю нужные мне свойства в надежде получить новые значения.
Нормалек, работает. Ок, сливаем бадягу в инет. М-да. Чешу злобно голову...
Получилось какак-то смутно. Чем больше тайминги у setInterval, тем больше шансов застать новые значения свойств и чем загруженней браузер (многооконный) - тем меньше. Отсюда и переодические глюки перемены свойств при смене туда и обратно.

Видать надо проверять изменения конкретного свойства или свойств.
Теперь, побаловав дух любознательности, иду учить пример старшего товарища smile

Автор: Sardar 1.4.2005, 15:26
А зачем тебе мониторить свойства картинок? Покажи код.

Автор: Иль 1.4.2005, 15:57
Слава тебе господи, отпустило smile , разобрался. Рад до слез smile

Sardar, а ведь все благодаря тебе, спасибо!!!

Я раньше не знал и нигде онлайн не мог найти (может просто не замечал), как задавать событие на к-либо элемент в функции, а не инлайн. Даже специально везде рылся (подумывал, что такого нет). А посмотрев код в предлагаемом тобой топике сразу сообразил. Так что прошу для чайников (и их подруг smile ) занести в FAQ данный синтаксис. Например
Код

element.onclic=метод;
...
function метод () {описание действий}
 

Даже обидно, как все просто.
И что вы думаете! Только я (после смены SRC) посадил мою картинку на onload, которому прописал метод считывания ее размеров, так сразу все стало работать без перебоев с первого раза!
smile Интересная деталь - если тестить локально, то ИЕ продалжает глючить, но через инет все браузеры работают - протестировал на 100 картинках.

И еще, та чек-функция смены SRC в твоем топике (47159) просто супер. Руки бы не дошли, а ты так все ладно сделал. Спасибо огромное.

Забыл про код - да там тривиальщина, чтоб дизаин не портился. Картинка изменилась - подгоняем по ее размерам соседний элемент (эстетика, Ё-моё). Уменьшилась - обратно.
Добавлено @ 15:58
Не, если интересно, я вырву код из контекста, очищу от воды и выложу...

Автор: Sardar 1.4.2005, 16:29
Цитата
занести в FAQ данный синтаксис

Не нужно, это базовый JS, учится в любом учебнике, на крайняк опытом smile Важно понять что всё в JS это обьекты, функция тоже обьект. У обьекта есть какието поля, также можно создавать свои поля. У обьектов есть конструктор, в поле prototype которого интерфейс обьекта. Жаль что к интерфейсу HTML элементов доступа из ИЕ по моему нет, в Опере и Мозилле есть обьекты DOM1, например HTMLImageElment. Учти что это не конструктор элемента, через него нельзя(теоретически) создать элемент, но можно доратся до интерфейса.

Любой обьект можно создать в некотором контексте, в котором он и будет жить, например внутри функции. Следовательно функции можно вкладывать друг в друга, при этом важно что все переменные обьявленные в функции выше продолжают быть доступными в функции ниже, даже после выхода. Запутанно? smile Смотрим пример:
Код
<script type="text/javascript">
<!--
function test() {
  var a=0;
  function timertest() {
    a++;
    document.getElementById("dbg").innerHTML+="<b>"+a+"</b><br />\n";
  }
  window.setInterval(timertest, 1000);
}

//-->
</script>

<button onClick="test()">Test</button>
<div id="dbg"></div>

Жмём на кнопку, видим что каждый раз запускается новый тред имеющий свой собственный контекст функции test с переменной а.

А вообще в JS много чего интересного, те же геттеры/сеттеры в Мозилле smile

Автор: 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 указывает на того кому принадлежит метод, в случае с "традиционнымйи обработчиками событий" ссылка указывает на обьект, к событию которого мы задавали функцию-обработчика.

Убедись что в твоём случае this это именно то что ты думаешь(опроси{правильный ответ}: nodeType{1}, tagName{IMG}).

Ссылка this указывет на обьект-картинку в нутри обработчика события, а каково его состояние(загруженно/нет) абсолютно не важно, ошибка в другом smile

Автор: Иль 5.4.2005, 07:46
Цитата(Sardar @ 5.4.2005, 01:13)
Подробнее об этом? Что за указанный глюк?

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

Автор: Aliance 5.4.2005, 15:38
Кинь кусок кода где ты меняешь Src и где параметры (ширина, высота)

Автор: Иль 5.4.2005, 20:57
Вот проблемный код
Код

<html><head>
<script language="JavaScript" type="text/JavaScript">
function ata(elem){
elem.src="pic2.gif";
document.getElementById("tat").style.height=elem.height;
}
</script></head>
<body>
<img src="pic1.gif" onClick="ata(this)" style=" border:3px solid">
<div id="tat" style="background-color:#009999; width:30px">123</div>
</body></html>

Условие: Картинка 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, опрашиваем её своства. Ты уже так и сделал smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)