событие jQuery для загруженных изображений


96

Можно ли определить, когда все изображения загружаются через событие jQuery?

В идеале должен быть

$(document).idle(function()
{
}

или

$(document).contentLoaded(function()
{
}

Но я не могу найти такого.

Думал прикрепить такое событие:

$(document).ready(function()
{
    var imageTotal = $('img').length;
    var imageCount = 0;        
    $('img').load(function(){if(++imageCount == imageTotal) doStuff();});
}

Но сломается ли это, если изображение не загрузится? Критически важно, чтобы метод был вызван в нужное время.


9
Почему бы вам не использовать событие onload: $ (window) .load (doStuff)? Однако Onload будет ждать и других ресурсов (например, скриптов, таблиц стилей и флэш-памяти), а не только изображений, которые могут вам подойти, а могут и не подойти.
мофф

Прикрепление события загрузки ко всем вашим тегам img, как в примере кода, должно работать. Если изображение не загружается, doStuff () не будет вызываться, но это кажется разумным, учитывая ваше требование о том, что все изображения должны быть загружены.
Стив Гудман,

2
Метод .load () устарел с jQuery 1.8. Проверьте это: stackoverflow.com/questions/3877027/…
fiorix

Ответы:


116

В документации jQuery есть ряд предостережений по использованию события загрузки с изображениями. Как отмечено в другом ответе, плагин ahpi.imgload.js не работает, но связанная с ним суть Paul Irish больше не поддерживается.

По словам Пола Айриша, канонический плагин для обнаружения событий завершения загрузки изображений теперь находится по адресу:

https://github.com/desandro/imagesloaded


4
Это ответ - обрабатывает несколько изображений, кешированные изображения, причуды браузера, битые изображения и текущие. Прекрасный.
Ярин

7
протестировал сегодня. заработал за 2 минуты.
CodeToad 05

Согласитесь с @Yarin, хорошей документацией, простой в использовании, множественной, кешированной, сломанной и актуальной. Любить это.
johntrepreneur

Однако с другой стороны, imagesLoaded не поддерживает IE7, если это важно для вас.
johntrepreneur

1
Быстрое и простое двухстрочное исправление для загрузки изображений в IE7 .
johntrepreneur

63

Если вы хотите проверить не все изображения, а конкретное (например, изображение, которое вы заменили динамически после того, как DOM уже завершена), вы можете использовать это:

$('#myImage').attr('src', 'image.jpg').on("load", function() {  
  alert('Image Loaded');  
});  

70
Будьте осторожны, потому load()что не сработает, когда изображение уже загружено. Это легко может произойти, когда изображение находится в кеше браузера пользователя. Вы можете проверить, загружено ли изображение уже с помощью $('#myImage').prop('complete'), который возвращает true, когда изображение загружено.
Blaise

6
Почему у него так много голосов, когда он а) не отвечает на его вопрос и б) кроме того дает плохое решение? (Значит, правильный ответ @ johnpolacek's и имеет 1 голос)
Ярин

5
ПРЕДУПРЕЖДЕНИЕ!!!!!!!!!!!!!!! Это неверный ответ. johnpolacek знает правильный ответ. Проголосуйте за его ответ.
mrbinky3000 03

4
Эти возражения больше не актуальны, за исключением очень специфических обстоятельств: Webkit, когда вы меняете src изображения на тот же самый src, что и раньше. Для изображений, которые вы только что добавили в DOM, должно быть достаточно $ (...). Load (). Протестировано в текущих версиях FF и Chrome, а также в IE6-9: jsfiddle.net/b9chris/tXVCe/2
Крис Москини

1
+1 Прекрасно работает, когда (вы знаете, что) изображение отсутствует в кеше браузера.
Lode

28

Вы можете использовать мой плагин waitForImages, чтобы справиться с этим ...

$(document).waitForImages(function() {
   // Loaded.
});

Преимущество этого заключается в том, что вы можете локализовать его для одного элемента-предка, и он может опционально обнаруживать изображения, на которые есть ссылки в CSS.

Это лишь верхушка айсберга, дополнительную функциональность можно найти в документации .


Привет, Алекс, выглядит многообещающе. Но, как упомянуто в ответах и ​​комментариях, данных johnpolacek и hirisov, охватывает ли это случай, когда изображение уже находится в кеше браузера?
SexyBeast

У меня есть процесс, который создает изображение и динамически загружает его после того, как страница уже загружена, и мне нужно было показать загрузчик ajax, пока пользователь ждет. Этот плагин идеально подходит для этого случая использования. Однако вы должны вызвать функцию после установки свойства img src!
Джон Ливермор

20

Использование jQuery $ (). Load () в качестве обработчика событий IMG не гарантируется. Если изображение загружается из кеша, некоторые браузеры могут не запускать событие. В случае (более старых?) Версий Safari, если вы изменили свойство SRC элемента IMG на то же значение , событие onload НЕ сработает.

Похоже, что это признается в последней версии jQuery (1.4.x) - http://api.jquery.com/load-event - чтобы процитировать:

Возможно, что событие загрузки не сработает, если изображение загружается из кеша браузера. Чтобы учесть эту возможность, мы можем использовать специальное событие загрузки, которое срабатывает немедленно, если изображение готово. event.special.load в настоящее время доступен как плагин.

Теперь есть подключаемый модуль для распознавания этого случая и свойства IE "complete" для состояний загрузки элементов IMG: http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js


16

В соответствии с этим ответом вы можете использовать событие загрузки jQuery для windowобъекта вместо document:

jQuery(window).load(function() {
    console.log("page finished loading now.");
});

Это сработает после того, как весь контент на странице будет загружен. Это отличается от того, jQuery(document).load(...)который запускается после завершения загрузки DOM.


Это именно то, что я искал!
Eric K

4

Плагин imagesLoaded - отличный вариант , если вам нужно кроссбраузерное решение.

 $("<img>", {src: 'image.jpg'}).imagesLoaded( function( $images, $proper, $broken ){
 if($broken.length > 0){
 //Error CallBack
 console.log('Error');
 }
 else{
 // Load CallBack
 console.log('Load');
 }
 });

Если вам просто нужен рабочий процесс IE, это подойдет

 var img = $("<img>", {
    error: function() {console.log('error'); },
    load: function() {console.log('load');}
    });
  img.attr('src','image.jpg');


2

Для изображений с одинаковым происхождением вы можете использовать:

$.get('http://www.your_domain.com/image.jpg', imgLoaded);

function imgLoaded(){
    console.log(this, 'loaded');
}


0
  function CheckImageLoadingState()
  {
     var counter = 0;
     var length = 0;

     jQuery('#siteContent img').each(function() 
     {
        if(jQuery(this).attr('src').match(/(gif|png|jpg|jpeg)$/))
          length++;
     });

     jQuery('#siteContent img').each(function() 
     {  
        if(jQuery(this).attr('src').match(/(gif|png|jpg|jpeg)$/))
        {
           jQuery(this).load(function() 
           {
           }).each(function() {
              if(this.complete) jQuery(this).load();
            });
        }
        jQuery(this).load(function()
        {
           counter++;
           if(counter === length) 
           {  
              //function to call when all the images have been loaded
              DisplaySiteContent();
           }
        });
     });
  }


0

Я создал свой собственный сценарий, потому что обнаружил, что многие плагины сильно раздуты, и я просто хотел, чтобы они работали так, как я хотел. Mine проверяет, имеет ли каждое изображение высоту (собственную высоту изображения). Я объединил это с функцией $ (window) .load (), чтобы обойти проблемы кеширования.

В моем коде это довольно много комментариев, поэтому на него будет интересно посмотреть, даже если вы не используете его. У меня он отлично работает.

Без лишних слов, вот он:

imgLoad.js скрипт


0

Ожидание загрузки всех изображений ...
Я нашел ответ на мою проблему с jfriend00 здесь jquery: как прослушать событие загрузки изображения одного контейнера div? .. и "if (this.complete)"
Ожидание загрузки всего, а некоторые, возможно, в кеше! .. и я добавил событие "error" ... оно надежно во всех браузерах

$(function() { // Wait dom ready
    var $img = $('img'), // images collection
        totalImg = $img.length,
        waitImgDone = function() {
            totalImg--;
            if (!totalImg) {
                console.log($img.length+" image(s) chargée(s) !");
            }
        };
    $img.each(function() {
        if (this.complete) waitImgDone(); // already here..
        else $(this).load(waitImgDone).error(waitImgDone); // completed...
    });
});

Демо: http://jsfiddle.net/molokoloco/NWjDb/


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.