图像加载的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也将等待其他资源(例如脚本,样式表和Flash),而不仅仅是图像,这可能对您不利,也可能不行。
莫夫

像在代码示例中一样,将load事件附加到所有img标签上应该可以正常工作。如果图像加载失败,则不会调用doStuff(),但是鉴于您必须加载所有图像的要求,这似乎是合理的。
史蒂夫·古德曼

2
从jQuery 1.8开始不推荐使用.load()方法。检查一下:stackoverflow.com/questions/3877027/…–
fiorix

Answers:


116

根据jQuery的文档,对于将load事件与图像一起使用有很多警告。如另一个答案中所述,ahpi.imgload.js插件已损坏,但不再维护链接的Paul Irish gist。

根据Paul Irish的说法,用于检测图像加载完成事件规范插件现在位于:

https://github.com/desandro/imagesloaded


4
这是多个图像,缓存图像,浏览器怪癖,损坏图像的答案,并且它是当前的图像。美丽。
Yarin 2012年

7
今天测试了。在2分钟内启动并运行
CodeToad 2012年

同意@Yarin,良好的文档,易于使用,多个,缓存的,已损坏的和最新的。爱它。
johntrepreneur

但不利的是,如果这对您很重要,则imagesLoaded不支持IE7
johntrepreneur

1
一种快速简单的两行修复程序,可在IE7上获得imagesLoaded
johntrepreneur

63

如果要检查的不是全部图像,而是特定的图像(例如,在DOM已经完成后动态替换的图像),则可以使用以下方法:

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

70
请小心,因为load()在已加载图像时不会触发。当图像位于用户的浏览器缓存中时,这很容易发生。您可以使用来检查图像是否已经加载$('#myImage').prop('complete'),加载图像时返回true。
布莱斯

6
为什么在a)没有回答他的问题,b)给出不好的解决方案时,为什么会有这么多的选票?(Meanshile的正确答案是@johnpolacek,并且有1票)
Yarin

5
警告!!!!!!!!!!!!!!!这不是正确的答案。johnpolacek有正确的答案。请投票给他答案。
mrbinky3000

4
这些异议似乎不再相关,只是在非常特殊的情况下:Webkit,当您将图像的src更改为与以前完全相同的src时。对于刚刚添加到DOM的图像,$(...)。load()应该足够了。在当前的FF和Chrome,以及IE6-9中进行了测试:jsfiddle.net/b9chris/tXVCe/2
克里斯·

1
当(您知道)图像不在浏览器缓存中时,+ 1工作正常。
2013年

28

您可以使用我的插件waitForImages处理此问题...

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

这样做的好处是您可以将其本地化到一个祖先元素,并且可以选择检测CSS中引用的图像。

不过,这只是冰山一角,请查看文档以获取更多功能。


嗨,Alex,看起来很有前途。但是,就像johnpolacek和hirisov给出的答案和评论中提到的那样,它是否涵盖了图像已经在浏览器缓存中的情况?
SexyBeast

我有一个创建图像并在页面加载后动态加载图像的过程,我需要在用户等待时显示ajax加载器。该插件非常适合该用例。您必须在设置img src属性后调用该函数!
约翰·利弗莫尔2014年

20

不保证将jQuery $()。load()用作IMG事件处理程序。如果图像是从缓存加载的,则某些浏览器可能不会触发该事件。对于Safari版本(较旧?),如果将IMG元素的SRC属性更改为相同的值,则不会触发onload事件。

看来,这是在最新的jQuery版本(1.4.x)认可- http://api.jquery.com/load-event -引用:

如果从浏览器缓存中加载了图像,则可能不会触发加载事件。为了解决这种可能性,我们可以使用特殊的加载事件,如果映像准备就绪,则会立即触发。event.special.load当前可作为插件使用。

现在有一个插件可以识别这种情况,并且IE的IMG元素加载状态的“ complete”属性为:http : //github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js


16

按照这个答案,您可以在对象上使用jQuery load事件window而不是使用document

jQuery(window).load(function() {
    console.log("page finished loading now.");
});

页面上的所有内容加载完毕后,将触发此操作。这与jQuery(document).load(...)DOM完成加载后触发的触发事件不同。


这正是我想要的!
埃里克·K

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

此刻在ahpi.imgload.js插件上有一条注释,指出它当前已损坏,请改尝试以下要点:https ://gist.github.com/797120/7176db676f1e0e20d7c23933f9fc655c2f120c58


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:如何收听一个容器div的图像加载事件?..和“ if(this.complete)”
等待所有内容加载,并且可能在缓存中!..并且我添加了“ error”事件... 它在所有浏览器中都非常可靠

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.