Подія 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 також буде чекати інших ресурсів (наприклад, скриптів, таблиць стилів та флеш-пам’яті), а не лише зображень, які можуть бути для вас чи ні.
moff

Приєднання події завантаження до всіх ваших тегів img, як це зроблено у зразку коду, повинно бути функціональним. Якщо зображення не завантажується, DoStuff () не буде викликано, але це здається розумним, враховуючи вашу вимогу, що всі зображення повинні бути завантажені.
Стів Гудмен

2
Метод .load () застарілий з часу jQuery 1.8. Перевірте це: stackoverflow.com/questions/3877027 / ...
fiorix

Відповіді:


116

Згідно з документацією jQuery , існує низка застережень щодо використання події завантаження із зображеннями. Як зазначається в іншій відповіді, плагін ahpi.imgload.js зламаний, але пов'язаний ірландський ідентифікатор Paul більше не підтримується.

На думку Павла Ірландського, канонічний плагін для виявлення повних подій, що завантажують зображення , зараз:

https://github.com/desandro/imagesloaded


4
Це відповіді - обробляє декілька зображень, кешованих зображень, примх браузера, зламаних зображень, і це поточне. Гарний.
Ярін

7
протестували його сьогодні. піднявся і працює протягом 2 хвилин.
CodeToad

Погодьтеся з @Yarin, хороша документація, проста у використанні, множинна, кешована, зламана та актуальна. Любіть це.
Johnt предприниматель

Однак мінусом є те, що imagesLoaded не підтримує IE7, якщо це важливо для вас.
Johntrepreneur

1
Швидке та просте виправлення у 2 рядки, щоб отримати завантажені зображення на IE7 .
johnt предприниматель

63

Якщо ви хочете перевірити, чи не всі зображення, а певні (наприклад, зображення, яке ви замінили динамічно після завершення DOM), ви можете скористатися цим:

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

70
Будьте уважні, тому що load()не буде спрацьовувати, коли зображення вже завантажено. Це може бути легко, коли зображення знаходиться в кеш-пам’яті браузера користувача. Ви можете перевірити, чи вже зображення завантажено за допомогою $('#myImage').prop('complete'), що повертає справжнє значення при завантаженні зображення.
Блез

6
Чому за це стільки голосів, коли він а) не відповідає на його запитання і б) окрім того, не дає поганого рішення? (Значить, правильна відповідь є @ johnpolacek's і має 1 голос)
Ярін

5
УВАГА!!!!!!!!!!!!!!! Це не правильна відповідь. johnpolacek має правильну відповідь. Будь ласка, проголосуйте його відповідь.
mrbinky3000

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

1
+1 Чудово працює, коли (ви це знаєте) зображення не знаходиться в кеші браузера.
Лод

28

Ви можете використовувати мій плагін waitForImages для обробки цього ...

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

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

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


Привіт Алекс, виглядає багатообіцяюче. Але, як і згадані у відповідях та коментарях, наданих johnpolacek та hirisov, чи охоплює це випадок, коли зображення вже є в кеші браузера?
SexyBeast

У мене є процес, який створює зображення і динамічно завантажує його після завантаження сторінки, і мені потрібно було показати завантажувач ajax, поки користувач чекає. Цей плагін чудово працює для цього випадку використання. Ви повинні викликати функцію після встановлення властивості img src!
Джон Лівермор,

20

Використання jQuery $ (). Load () як обробника подій IMG не гарантується. Якщо зображення завантажується з кешу, деякі браузери можуть не запустити подію. У випадку (старіших?) Версій Safari, якщо ви змінили властивість SRC елемента IMG на таке ж значення , подія завантаження НЕ запуститься.

Здається, це визнано в останньому jQuery (1.4.x) - http://api.jquery.com/load-event - цитувати:

Можливо, що подія завантаження не буде запущено, якщо зображення завантажено з кешу браузера. Для врахування такої можливості ми можемо використовувати спеціальну подію навантаження, яка негайно запускається, якщо зображення готове. event.special.load наразі доступний як плагін.

Зараз використовується плагін для розпізнавання цього випадку та властивості IE "завершеного" для стану завантаження елементів 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.


Це саме те, що я шукав!
Ерік К

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 WorkAround, це буде робити

 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

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

Я кодував його досить сильно, тому на нього слід цікаво подивитися, навіть якщо ви ним не користуєтесь. Це прекрасно працює для мене.

Без зайвої приналежності, ось це:

сценарій imgLoad.js


0

Очікуючи завантаження всіх зображень ...
Я знайшов прихильника моєї проблеми з jfriend00 тут jquery: як слухати події завантажених зображеннями одного контейнера діла? .. і "якщо (this.complete)"
Чекаю, коли все завантажиться, а можливо, і в кеш-пам'яті! .. І я додав подію "помилки" ... це надійно для всіх браузерів

$(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.