在jQuery中,当你这样做:

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

它等待DOM加载并执行您的代码。如果没有加载所有的图像,那么它仍然执行代码。这显然是我们在初始化任何DOM内容(如显示或隐藏元素或附加事件)时所需要的。

假设我想要一些动画我不想让它运行直到所有图像都加载完毕。jQuery中有官方的方法来做到这一点吗?

最好的方法是使用<body onload="finished()“>,但除非迫不得已,我真的不想这么做。

注意:在ie浏览器的jQuery 1.3.1中有一个bug,它实际上是在执行$function(){}内的代码之前等待所有图像加载。所以如果你正在使用这个平台,你会得到我正在寻找的行为,而不是上面描述的正确行为。


当前回答

在jQuery中,你可以使用$(document).ready()在DOM加载时执行一些东西,并使用$(window)。On ("load", handler)在所有其他东西也加载时执行一些东西,比如图像。

如果你有很多jollyrogerNN JPEG文件(或其他合适的文件),你可以在以下完整的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 in total
        <img src="jollyroger99.jpg">
    </body>
</html>

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

$(document).ready(function() {

成:

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

然后警报框直到图像加载后才会出现。

因此,要等待整个页面准备就绪,您可以使用如下代码:

$(window).on("load", function() {
    // weave your magic here.
});

其他回答

用jQuery我来这个…

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

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

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

演示:http://jsfiddle.net/molokoloco/NWjDb/

这样,当body或任何其他容器(取决于您的选择)内的所有图像都加载时,您可以执行一个操作。纯JQUERY,不需要插件。

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();        
});

我找到了这个解决方案:@Luca Matteis 在这里:https://www.examplefiles.net/cs/508021

但是我稍微编辑了一下,如下图所示:

function showImage(el){
    $(el).removeClass('hidden');
    $(el).addClass('show');

    $(el).prev().removeClass('show');
    $(el).prev().addClass('hidden');
}

<img src="temp_image.png" />
<img class="hidden" src="blah.png" onload="showImage(this);"/>

对于那些想要在$(window)之后收到请求的单个图像下载完成通知的人。Load触发,你可以使用image元素的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");
});

使用imagesLoaded PACKAGED v3.1.8(最小化时6.8 Kb)。这是一个相对较老的项目(自2010年以来),但仍然是活跃的项目。

你可以在github上找到: https://github.com/desandro/imagesloaded

他们的官方网站: http://imagesloaded.desandro.com/

为什么它比使用更好:

$(window).load() 

因为您可能希望动态加载图像,就像这样:jsfiddle

$('#button').click(function(){
    $('#image').attr('src', '...');
});