在执行某些操作之前,要求jQuery等待所有图像加载的官方方法

Sim*_*ver 635 jquery

在jQuery中执行此操作时:

$(function() {
   alert("DOM is loaded, but images not necessarily all loaded");
});
Run Code Online (Sandbox Code Playgroud)

它等待DOM加载并执行您的代码.如果未加载所有图像,则它仍然执行代码.如果我们正在初始化任何DOM内容,例如显示或隐藏元素或附加事件,这显然是我们想要的.

让我们说虽然我想要一些动画但我不希望它运行直到所有图像都被加载.jQuery中是否有正式的方法来执行此操作?

我有最好的方法就是使用<body onload="finished()">,但除非必须这样做,否则我真的不想这样做.

注意:Internet Explorer 中的jQuery 1.3.1中存在一个错误,它实际上会在执行内部代码之前等待加载所有图像$function() { }.因此,如果您正在使用该平台,您将获得我正在寻找的行为,而不是上述正确的行为.

pax*_*blo 1023

使用jQuery,您可以$(document).ready()在加载DOM时执行某些操作,并在加载$(window).on("load", handler)所有其他内容时执行某些操作,例如图像.

如果您有jollyrogerJPEG文件(或其他合适的文件),可以在以下完整的HTML文件中看到差异:

<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>
Run Code Online (Sandbox Code Playgroud)

这样,警报框就会在加载图像之前出现,因为此时DOM已准备就绪.如果你改变了:

$(document).ready(function() {
Run Code Online (Sandbox Code Playgroud)

成:

$(window).on("load", function() {
Run Code Online (Sandbox Code Playgroud)

然后在加载图像之后才会出现警告框.

因此,要等到整个页面准备就绪,您可以使用以下内容:

$(window).on("load", function() {
    // weave your magic here.
});
Run Code Online (Sandbox Code Playgroud)

  • *咂额头*+1完全忘了.$(窗口).load()在图像完成之前不会触发. (31认同)
  • 只是一个注意事项 - 这似乎不适用于Chromium(我认为Chrome).$(window).ready事件似乎与$(document).ready相同 - 在图像完成之前. (24认同)
  • 但它是$(窗口).load(function()) (24认同)
  • 我做了同样的事.甚至,通过回答不知道它是我,仍然不理解它. (10认同)
  • @KyorCode你确定这不仅仅是因为IE中的图像被缓存了吗?如果发生这种情况,他们根本不会发起"加载"事件.[本文](http://css-tricks.com/snippets/jquery/fixing-load-in-ie-for-cached-images/)有助于解决此问题. (3认同)
  • $(window).load(),$(window).ready()和$(document).ready()在Chromium中加载图像之前都为我开火. (2认同)

ale*_*lex 156

我写了一个插件,可以在图像加载元素时触发回调,或者每个图像加载时触发一次.

它类似于$(window).load(function() { .. }),除了它允许您定义要检查的任何选择器.如果您只想知道#content(例如)中的所有图像何时加载,这就是您的插件.

它还支持在CSS中引用图片,例如加载background-image,list-style-image等等.

waitForImages jQuery插件

示例用法

$('selector').waitForImages(function() {
    alert('All images are loaded.');
});
Run Code Online (Sandbox Code Playgroud)

关于jsFiddle的示例.

GitHub页面上提供了更多文档.

  • 它基本上类似于imagesLoaded,但它也适用于srcsets.正是我在寻找的东西!很棒的插件! (2认同)

hya*_*kov 48

$(window).load()仅在第一次加载页面时才会起作用.如果你正在做动态的东西(例如:点击按钮,等待加载一些新图像),这将无法正常工作.为此,您可以使用我的插件:

演示

下载

/**
 *  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);
Run Code Online (Sandbox Code Playgroud)


Dan*_*aro 19

对于那些希望收到$(window).load火灾后请求的单个图像的下载完成通知的用户,可以使用图像元素的load事件.

例如:

// 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");
});
Run Code Online (Sandbox Code Playgroud)


Coz*_*Coz 13

到目前为止,没有一个答案给出了似乎最简单的解决方案.

$('#image_id').load(
  function () {
    //code here
});
Run Code Online (Sandbox Code Playgroud)


Adr*_* Be 6

我建议使用imagesLoaded.jsjavascript库.

为什么不使用jQuery $(window).load()呢?

正如/sf/ask/1884930281/

这是一个范围问题.imagesLoaded允许您定位一组图像,而$(window).load()目标是所有资源 - 包括所有图像,对象,.js和.css文件,甚至是iframe.最有可能的是,imagesLoaded会更快触发,而不是$(window).load()因为它针对的是较小的一组资产.

使用imagesloaded的其他好理由

  • IE8 +正式支持
  • 许可证:MIT许可证
  • 依赖:没有
  • 重量(缩小和压缩):7kb缩小(轻!)
  • 下载构建器(有助于减轻重量):不需要,已经很小了
  • 在Github上:是的
  • 社区和贡献者:相当大,4000多名成员,虽然只有13个贡献者
  • 历史和贡献:相对较老(自2010年以来)稳定但仍然活跃的项目

资源