开发者

IE9 problems with jQuery load() event not firing

开发者 https://www.devze.com 2023-03-29 09:02 出处:网络
I am trying to preload a couple of images and would like my page to go on hold until all of the images are loaded. So what I am doing is this:

I am trying to preload a couple of images and would like my page to go on hold until all of the images are loaded. So what I am doing is this:

var numPics = $('#bg img').length;
var picsLoaded = 0;
$('#bg img').load(function(){
    picsLoaded++;
    if (picsLoaded == numPics){
        buildPage();
    }

});

This works fine in all browsers except (you guessed it) IE. Somehow the Internet Explorer will download all pictures (I can see them being loaded in the dev-tools), but will only randomly fire the load-Event (each refresh will give me an new number, usually it will count up to about 开发者_运维知识库half of the images. I tried different versions of jQuery (I initially started with 1.6.1) and have also read about problems like this on this site but could not find any answer yet.

Also it does not seem to be a cache related problem as busting it (or appending a random querystring to the image source) did not make a difference.


Try to re-assign the image source in order to trigger the event:

var numPics = $('#bg img').length;
var picsLoaded = 0;
$('#bg img').each(function(index) {
    var img = $(this);
    img.load(function(){
        picsLoaded++;
        if (picsLoaded == numPics){
            buildPage();
        }
    });
    img.attr("src", img.attr("src"));
});


As of jQuery 1.8, $.load() has been deprecated (http://bugs.jquery.com/ticket/11733) in favor of:

image.bind('load', function() {});

Also puchu's comment is interesting. However $.browser has been deprecated and uses UA sniffing. This snippet should do the trick: https://gist.github.com/527683 (see Javascript IE detection, why not use simple conditional comments? ).

EDIT: This bug persists in IE 10. Also the gist snippet I linked too doesn't detect IE 10, but there are comments there for workarounds.


+to the answer: Do not run this in firefox 3.6:

img.attr("src", img.attr("src"));

Some amount of images will not be loaded! I prefer:

if($.browser.msie && parseInt($.browser.version, 10) >= 9) {
    img_load.attr("src", img_load.attr("src"));
}


Do not create a dynamic source as many suggest, all you have to do is apply the source after binding the load event like so...

$("img").load(function() {alert("loaded!"}).attr("src", imgSource);

0

精彩评论

暂无评论...
验证码 换一张
取 消