событие 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.