Я хочу делать:
$("img").bind('load', function() {
// do stuff
});
Но событие загрузки не срабатывает, когда изображение загружается из кэша. Документы jQuery предлагают плагин, чтобы это исправить, но он не работает
jquery
image
jquery-events
jquery-load
Том Леман
источник
источник
Ответы:
Если
src
он уже установлен, то событие запускается в кэшированном случае еще до того, как вы привязали обработчик события. Чтобы это исправить, вы можете циклически проверять и запускать событие на основе.complete
следующем:Обратите внимание на изменение с
.bind()
на,.one()
чтобы обработчик событий не запускался дважды.источник
setTimeout(function(){//do stuff},0)
'load' ... 0 дает системе браузера (DOM) один дополнительный тик, чтобы убедиться, что все правильно обновлено..load()
не вызывает событие и имеет 1 обязательный аргумент, используйте.trigger("load")
вместо негоМогу ли я предложить вам перезагрузить его в объект изображения не из DOM? Если он кешируется, это совсем не займет времени, а нагрузка все равно сработает. Если он не кэшируется, он будет запускать загрузку при загрузке изображения, что должно быть одновременно с завершением загрузки DOM-версии образа.
Javascript:
Обновлено (для обработки нескольких изображений и с правильно упорядоченным вложенным приложением):
источник
load
обработчик до того, как он будет добавлен, также это не будет работать, но для одного изображения код OPs работает для многих :)#img
является идентификатором, а не селектором элемента :) Такжеthis.src
работает, нет необходимости использовать jQuery там, где он не нужен :) Но создание другого изображения кажется избыточным в любом случае IMO.imageLoaded
, то используйтеtmp.onload = imageLoaded.bind(this)
Мое простое решение, для него не нужен внешний плагин и для общих случаев должно быть достаточно:
используйте это так:
Например, чтобы добавить изображения к загрузке, вы можете сделать:
Или в качестве альтернативы, если вы предпочитаете jquery-подобный плагин подход:
и использовать его таким образом:
например:
источник
width
,max-height
и отпускheight:auto
, часто необходимо установить как ширину и высоту , только если вам нужно , чтобы растянуть изображение; для более надежного решения я бы использовал плагин, такой как ImagesLoadedВы действительно должны сделать это с JQuery? Вы можете прикрепить
onload
событие непосредственно к вашему изображению;Он будет срабатывать каждый раз, когда изображение загружено, из кэша или нет.
источник
onload
обработчик срабатывать при повторной загрузке изображения из кэша?Вы также можете использовать этот код с поддержкой ошибки загрузки:
источник
load
сначала установить обработчик, а затем вызвать его позже вeach
функции.У меня просто была эта проблема, я всюду искал решение, которое не включало бы уничтожение моего кэша или загрузку плагина.
Я не видел эту ветку сразу, поэтому нашел что-то еще, что является интересным исправлением и (я думаю) достойным публикации здесь:
Я на самом деле получил эту идею из комментариев здесь: http://www.witheringtree.com/2009/05/image-load-event-binding-with-ie-using-jquery/
Я понятия не имею, почему это работает, но я проверил это на IE7 и где он сломался, прежде чем теперь работает.
Надеюсь, поможет,
редактировать
Принятый ответ фактически объясняет, почему:
источник
$image.load(function(){ something(); }).attr('src', $image.attr('src'));
для сброса исходного источника.Используя jQuery для генерации нового изображения с помощью src изображения и назначая непосредственно для него метод загрузки, метод загрузки успешно вызывается, когда jQuery завершает генерацию нового изображения. Это работает для меня в IE 8, 9 и 10
источник
Решение, которое я нашел, https://bugs.chromium.org/p/chromium/issues/detail?id=7731#c12 (этот код взят непосредственно из комментария)
источник
Модификация примера GUS:
Установите источник до и после загрузки.
источник
src
перед тем, как присоединятьonload
обработчик, а потом будет достаточно.Просто добавьте аргумент src в отдельную строку после определения изображения. Это обманом заставит IE запустить лад-событие. Это уродливо, но это самый простой обходной путь, который я нашел до сих пор.
источник
Я могу дать вам небольшой совет, если вы хотите сделать так:
Если вы делаете это, когда браузер кеширует изображения, то это не проблема, всегда показывается img, но загружается img под реальным изображением.
источник
У меня была эта проблема с IE, где e.target.width будет неопределенным. Событие load сработало бы, но я не смог получить размеры изображения в IE (сработал chrome + FF).
Оказывается, вам нужно искать e.currentTarget.naturalWidth & e.currentTarget.naturalHeight .
Еще раз, IE делает вещи своим собственным (более сложным) способом.
источник
Вы можете решить вашу проблему, используя плагин JAIL, который также позволяет лениво загружать изображения (улучшая производительность страницы) и передавая обратный вызов в качестве параметра
HTML должен выглядеть так
источник
Если вам нужно чистое решение CSS, этот прием работает очень хорошо - используйте объект transform. Это также работает с изображениями, когда они кэшированы или нет:
CSS:
HTML:
Пример Codepen
Codepen LESS пример
источник