Oficjalny sposób zapytania jQuery czekać na załadowanie wszystkich obrazów przed wykonaniem czegoś

W jQuery kiedy to robisz:

$(function() {
   alert("DOM is loaded, but images not necessarily all loaded");
});

Oczekuje na załadowanie DOM i wykonanie kodu. Jeśli wszystkie obrazy nie są załadowane, to nadal wykonuje kod. Jest to oczywiście to, czego chcemy, jeśli inicjujemy jakieś elementy DOM, takie jak pokazywanie lub ukrywanie elementów lub dołączanie zdarzeń.

Powiedzmy jednak, że chcę animacji i nie chcę, aby działała, dopóki wszystkie obrazy nie zostaną załadowane. Czy jest na to jakiś oficjalny sposób w jQuery?

Najlepszy sposób, jaki mam, to użyj <body onload="finished()">, ale nie chcę tego robić, chyba że będę musiał.

Uwaga: Istnieje błąd w jQuery 1.3.1 w Internet Explorerze, który w rzeczywistości czeka na załadowanie wszystkich obrazów przed wykonaniem kodu wewnątrz $function() { }. Więc jeśli korzystasz z tej platformy, uzyskasz zachowanie, którego szukam, zamiast prawidłowego zachowania opisanego powyżej.

 603
Author: Community, 2009-02-13

10 answers

W jQuery, używasz $(document).ready() Aby wykonać coś, gdy DOM jest załadowany i $(window).on("load", handler) aby wykonać coś, gdy wszystkie inne rzeczy są załadowane, jak na przykład obrazy.

Różnicę widać w poniższym pełnym pliku HTML, pod warunkiem, że masz jollyroger pliki JPEG (lub inne odpowiednie):

<html>
    <head>
        <script src="jquery-1.7.1.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                alert ("done");
            });
        </script>
    </head><body>
        Hello
        <img src="jollyroger00.jpg">
        <img src="jollyroger01.jpg">
        // : 100 copies of this
        <img src="jollyroger99.jpg">
    </body>
</html>

Z tym, okno alertu pojawia się przed załadowaniem obrazów, ponieważ DOM jest gotowy w tym momencie. If you then zmiana:

$(document).ready(function() {

Do:

$(window).on("load", function() {

Następnie okno alertu pojawia się dopiero po załadowaniu obrazów.

Dlatego, aby poczekać, aż cała strona będzie gotowa, możesz użyć czegoś w stylu:

$(window).on("load", function() {
    // weave your magic here.
});
 989
Author: paxdiablo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-01 20:16:21

Napisałem wtyczkę, która może odpalić wywołania zwrotne po załadowaniu obrazów w elementach lub odpalić raz na załadowany obraz.

Jest podobny do $(window).load(function() { .. }), z tym, że pozwala zdefiniować dowolny selektor do sprawdzenia. Jeśli chcesz tylko wiedzieć, kiedy wszystkie obrazy w #content (na przykład) zostały załadowane, jest to wtyczka dla Ciebie.

Obsługuje również ładowanie obrazów odwołujących się do CSS, takich jak background-image, list-style-image, itd.

WaitForImages jQuery plugin

Przykładowe Użycie

$('selector').waitForImages(function() {
    alert('All images are loaded.');
});

Przykład na jsFiddle .

Więcej dokumentacji jest dostępnych na stronie GitHub.

 153
Author: alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-22 10:12:15

$(window).load() będzie działać tylko przy pierwszym załadowaniu strony. Jeśli robisz dynamiczne rzeczy (przykład: kliknij przycisk, poczekaj na załadowanie nowych obrazów), to nie zadziała. Aby to osiągnąć, możesz użyć mojej wtyczki:

Demo

Pobierz

/**
 *  Plugin which is applied on a list of img objects and calls
 *  the specified callback function, only when all of them are loaded (or errored).
 *  @author:  H. Yankov (hristo.yankov at gmail dot com)
 *  @version: 1.0.0 (Feb/22/2010)
 *  http://yankov.us
 */

(function($) {
$.fn.batchImageLoad = function(options) {
    var images = $(this);
    var originalTotalImagesCount = images.size();
    var totalImagesCount = originalTotalImagesCount;
    var elementsLoaded = 0;

    // Init
    $.fn.batchImageLoad.defaults = {
        loadingCompleteCallback: null, 
        imageLoadedCallback: null
    }
    var opts = $.extend({}, $.fn.batchImageLoad.defaults, options);

    // Start
    images.each(function() {
        // The image has already been loaded (cached)
        if ($(this)[0].complete) {
            totalImagesCount--;
            if (opts.imageLoadedCallback) opts.imageLoadedCallback(elementsLoaded, originalTotalImagesCount);
        // The image is loading, so attach the listener
        } else {
            $(this).load(function() {
                elementsLoaded++;

                if (opts.imageLoadedCallback) opts.imageLoadedCallback(elementsLoaded, originalTotalImagesCount);

                // An image has been loaded
                if (elementsLoaded >= totalImagesCount)
                    if (opts.loadingCompleteCallback) opts.loadingCompleteCallback();
            });
            $(this).error(function() {
                elementsLoaded++;

                if (opts.imageLoadedCallback) opts.imageLoadedCallback(elementsLoaded, originalTotalImagesCount);

                // The image has errored
                if (elementsLoaded >= totalImagesCount)
                    if (opts.loadingCompleteCallback) opts.loadingCompleteCallback();
            });
        }
    });

    // There are no unloaded images
    if (totalImagesCount <= 0)
        if (opts.loadingCompleteCallback) opts.loadingCompleteCallback();
};
})(jQuery);
 48
Author: Roko C. Buljan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-15 19:56:12

Dla tych, którzy chcą być powiadamiani o zakończeniu pobierania pojedynczego obrazu, który zostanie wywołany po wywołaniu $(window).load, możesz użyć zdarzenia load elementu obrazu.

Np.:

// create a dialog box with an embedded image
var $dialog = $("<div><img src='" + img_url + "' /></div>");

// get the image element (as a jQuery object)
var $imgElement = $dialog.find("img");

// wait for the image to load 
$imgElement.load(function() {
    alert("The image has loaded; width: " + $imgElement.width() + "px");
});
 19
Author: Dan Passaro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-18 00:07:31

Żadna z odpowiedzi do tej pory nie dała tego, co wydaje się być najprostszym rozwiązaniem.

$('#image_id').load(
  function () {
    //code here
});
 8
Author: Coz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-23 21:17:19

Polecam użycie imagesLoaded.js biblioteki javascript.

Dlaczego nie użyć jQuery $(window).load()?

Jako ansered on https://stackoverflow.com/questions/26927575/why-use-imagesloaded-javascript-library-versus-jquerys-window-load/26929951

To kwestia zakresu. imagesLoaded pozwala kierować zestaw obrazów, podczas gdy $(window).load() celuje w wszystkie aktywa - w tym wszystkie obrazy, obiekty, .js i .pliki css, a nawet iframes. Najprawdopodobniej obrazy będą Uruchom wcześniej niż $(window).load(), ponieważ celuje w mniejszy zestaw aktywów.

Inne dobre powody, aby używać imagesloaded

  • oficjalnie wspierany przez IE8 +
  • licencja: Licencja MIT
  • zależności: brak
  • waga (minified & gzipped) : 7KB minified (light!)
  • Pobierz builder ( pomaga zmniejszyć wagę): nie ma potrzeby, już małe
  • na Githubie: Tak
  • społeczność i współpracownicy: całkiem duża, ponad 4000 członków, chociaż tylko 13 uczestników
  • historia i wkład : stabilny jako stosunkowo stary (od 2010 roku), ale nadal aktywny projekt

Zasoby

 5
Author: Adrien Be,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:32

Z jQuery przychodzę z tym...

$(function() {
    var $img = $('img'),
        totalImg = $img.length;

    var waitImgDone = function() {
        totalImg--;
        if (!totalImg) alert("Images loaded!");
    };

    $('img').each(function() {
        $(this)
            .load(waitImgDone)
            .error(waitImgDone);
    });
});

Demo: http://jsfiddle.net/molokoloco/NWjDb/

 4
Author: molokoloco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-06 10:23:11

Użyj imagesLoaded PACKAGED v3. 1. 8 (6,8 Kb po zminimalizowaniu). Jest to stosunkowo stary (od 2010 roku), ale wciąż aktywny projekt.

Możesz go znaleźć na GitHubie: https://github.com/desandro/imagesloaded

Ich oficjalna strona: http://imagesloaded.desandro.com/

Dlaczego jest lepiej niż używać:

$(window).load() 

Ponieważ możesz chcieć ładować obrazy dynamicznie, jak to: jsfiddle

$('#button').click(function(){
    $('#image').attr('src', '...');
});
 1
Author: Yevgeniy Afanasyev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-19 00:34:45

W ten sposób możesz wykonać akcję, gdy załadowane zostaną wszystkie obrazy wewnątrz ciała lub innego kontenera (który zależy od Twojego wyboru). Czysty JQUERY, bez plugginsów.

var counter = 0;
var size = $('img').length;

$("img").load(function() { // many or just one image(w) inside body or any other container
    counter += 1;
    counter === size && $('body').css('background-color', '#fffaaa'); // any action
}).each(function() {
  this.complete && $(this).load();        
});
 1
Author: Mario Medrano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-01 19:25:31

Moje rozwiązanie jest podobne do molokoloco . Zapisany jako funkcja jQuery:

$.fn.waitForImages = function (callback) {
    var $img = $('img', this),
        totalImg = $img.length;

    var waitImgLoad = function () {
        totalImg--;
        if (!totalImg) {
            callback();
        }
    };

    $img.each(function () {
        if (this.complete) { 
            waitImgLoad();
        }
    })

    $img.load(waitImgLoad)
        .error(waitImgLoad);
};

Przykład:

<div>
    <img src="img1.png"/>
    <img src="img2.png"/>
</div>
<script>
    $('div').waitForImages(function () {
        console.log('img loaded');
    });
</script>
 0
Author: Mariusz Charczuk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 05:26:45