Официальный способ попросить jQuery дождаться загрузки всех изображений перед выполнением чего-либо

Я уверен, что это невозможно сделать с использованием чистой Java - вам, вероятно, придется использовать собственный код для привязки дескриптора файла к объекту FileDescriptor или к объекту FileInputStream или FileOutputStream.

EDIT Если вы используете Linux, * BSD или macOS, вы можете использовать псевдо-файлы / dev / fd / nnn для доступа к файловому дескриптору nnn.

621
задан Community 23 May 2017 в 11:47
поделиться

2 ответа

С jQuery Вы используете $(document).ready() для выполнения чего-то, когда DOM загружается и $(window).on("load", handler) для выполнения чего-то, когда все другие вещи загружаются также, такие как изображения.

различие видно в следующем полном файле HTML, если Вы имеете jollyroger файлы JPEG (или другие подходящие):

<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>

С этим, окно предупреждений появляется, прежде чем изображения загружаются, потому что DOM готов в той точке. Если Вы затем изменяетесь:

$(document).ready(function() {

в:

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

затем окно предупреждений не появляется, до после изображения загружаются.

Следовательно, для ожидания, пока вся страница не готова, Вы могли использовать что-то как:

$(window).on("load", function() {
    // weave your magic here.
});
1020
ответ дан gsamaras 23 May 2017 в 21:47
поделиться

$(window).load() будет работать только при первой загрузке страницы. Если вы делаете динамические действия (например, нажимаете кнопку, ждете загрузки новых изображений), это не сработает. Для этого вы можете использовать мой плагин:

Demo

Download

/**
 *  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
ответ дан 22 November 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: