#javascript #jquery #dom #image-loading
#javascript #jquery #dom #загрузка изображения
Вопрос:
Я использую плагин jQuery, который вызывает обратный вызов после загрузки всех изображений на странице. Он проверяет imageObject.complete
свойство и привязывает обработчик к событиям load
и error
, чтобы определить, когда загрузка изображения завершена.
Это работает хорошо, но проблема, с которой я сталкиваюсь, заключается в том, что, хотя изображение считается загруженным, когда я проверяю height
и width
свойства изображения или содержащего его div
элемента, размеры еще не были обновлены.
Вот пример:
Как я могу убедиться, что размер содержащего элемента был изменен в соответствии с изображением, прежде чем пытаться получить доступ к его height
и width
размерам?
ПРАВКА 1: Я очистил и прокомментировал код в моем jsfiddle, чтобы сделать пример более понятным.
ПРАВКА 2: Должно быть условие гонки или изменение, основанное на кэшировании, потому что, когда я запускаю код с другого компьютера, он работает должным образом (т. Е. верхнее поле вычисляется правильно), что на самом деле нехорошо, потому что оно не согласовано. Несоответствия более очевидны в Chrome, FWIW.
Также, чтобы было понятно, цель состоит не в том, чтобы вызывать его init
каждый раз при загрузке изображения; скорее, его init
следует вызывать один раз после того, как все изображения были загружены с помощью вызова AJAX load
.
Комментарии:
1. Немного почистил код: jsfiddle.net/RtnVx/7
2. Обновленный ответ для обработки нескольких изображений, а также для обработки состояний ошибки.
Ответ №1:
Ответ: http://jsfiddle.net/morrison/RtnVx/30 /
Вам нужно было не вызывать batchImageLoad
до завершения загрузки изображения. Я создал событие для загруженного изображения.
Обновленные примечания:
- Я отключил ваш плагин jQuery. Это было слишком сложно, и я не совсем понял это.
- Мое текущее решение обеспечивает обработку ошибок с помощью
error
события, как и подключаемый модуль. - Процесс решения:
- Найдите все
img
значения, убывающие от#slides
, и сохраните эту длину в.data()
атрибуте, а также в переменной, чтобы сохранить, сколько их было загружено. - Свяжите события
load
иerror
для каждогоimg
, которые обновляют количество загруженных изображений. - Если количество загруженных / исправленных изображений превысит общее количество изображений, вызывайте
setTimeout()
до тех пор, пока ширина всех из них не превысит ноль, а затем запуститеinit()
.
- Найдите все
Комментарии:
1.Спасибо за ответ! Но
batchImageLoad
не перезванивает вinit
, пока не будут загружены все изображения, поэтому не должно иметь значения, когда я его вызываю, верно? Кроме того, ваш код будет вызыватьinit
для каждого изображения. Я хочу вызватьinit
один раз после загрузки всех изображений. (Я понимаю, что в моем примере есть только одно изображение.)2. @Levin Спасибо за обновление. Однако ваш jsfiddle выдает мне страницу 404. Плагин также привязывает
load
иerror
ко всем элементам изображения, а также проверяет,image.complete
находится ли изображение в кэше (в этом случаеload
не будет срабатывать). Суть проблемы в том, что, хотя изображение загружено, егоheight
иwidth
свойства еще не обязательно будут обновлены. Я нахожу, что такое поведение особенно непоследовательно в Chrome. Я думаю, мы выяснили, как дождаться загрузки всех изображений. Теперь нам нужно выяснить, как подключиться к заданным высоте и ширине.3. У @Rob Jsfiddle недавно возникли проблемы с этим. Попробуйте обновить ссылку сейчас.
4. @Levi jsfiddle восстановлен. Ваш код хорош и прост и выполняет то, что делает
batchImageLoad
плагин, но по-прежнему сталкивается с проблемой, заключающейся в том, что, хотя загрузка изображений завершена, их размеры не были обновлены.5. @Rob Вы хотите использовать
centerSlides()
после загрузки изображений, но они не всегда изменяются во времени иcenterSlides()
поэтому работают некорректно. Правильно?