jQuery加载完整回调的图像

时间:2010-03-06 12:15:13

标签: jquery image load complete

我看到{R}发布了一个加载器的a comment on Ben Nadel's blog,但我无法弄清楚如何通过选择器和参数。 我想我还需要一个完整的回调和放大器。 errorCallback函数?

function imgLoad(img, completeCallback, errorCallback) {
    if (img != null && completeCallback != null) {
        var loadWatch = setInterval(watch, 500);
        function watch() {
            if (img.complete) {
                clearInterval(loadWatch);
                completeCallback(img);
            }
        }
    } else {
        if (typeof errorCallback == "function") errorCallback();
    }
}
// then call this from anywhere
imgLoad($("img.selector")[0], function(img) {
    $(img).fadeIn();
});

HTML:

<a href="#" class="tnClick" ><img id="myImage" src="images/001.jpg" /></a>

JS:

$(document).ready(function() {
    var newImage = "images/002.jpg";
    $("#myImage").css("display","none");
    $("a.tnClick").click(function() {
        // imgLoad here
    });
})

4 个答案:

答案 0 :(得分:41)

如果你想在展示之前加载它,你可以减少很多,如下所示:

$(document).ready(function() {
    var newImage = "images/002.jpg"; //Image name

    $("a.tnClick").click(function() {
      $("#myImage").hide() //Hide it
        .one('load', function() { //Set something to run when it finishes loading
          $(this).fadeIn(); //Fade it in when loaded
        })
        .attr('src', newImage) //Set the source so it begins fetching
        .each(function() {
          //Cache fix for browsers that don't trigger .load()
          if(this.complete) $(this).trigger('load');
        });
    });
});

.one()调用确保.load()仅触发一次,因此没有重复的淡入淡出。最后的.each()是因为某些浏览器不会为从缓存中获取的图像触发load事件,这就是您发布的示例中的轮询也正在尝试执行的操作。

答案 1 :(得分:4)

在对图像使用加载事件时需要小心,因为如果在浏览器的缓存IE中找到图像并且(我被告知)Chrome将不会按预期触发事件。

由于我自己不得不面对这个问题,我通过检查DOM属性完成(据说在大多数主流浏览器中工作)来解决:如果等于true,我只是解除了之前绑定的'load'事件的绑定。见例:

$("#myimage").attr("src","http://www.mysite.com/myimage.jpg").load(doSomething);

if ($("#myimage").get(0).complete) {

    // already in cache?
            $("#myimage").unbind("load");
            doSomething();


}

希望这有帮助

答案 2 :(得分:1)

我想要这个功能,绝对不希望在页面渲染时加载所有图像。我的图像是在亚马逊s3和一个大的照相馆,这将是很多不必要的请求。我创建了一个快速jQuery插件来处理它here

$("#image-1").loadImage('/path/to/new/image.jpg',function(){  
  $(this).css({height:'120px'});//alter the css styling after the image has loaded
});

所以基本上,每当用户点击代表一组图片的缩略图时,我就会在那个时间点加载其他图像。回调允许我在加载图像后更改css。

答案 3 :(得分:0)

试试这个?

doShow = function() {
  if ($('#img_id').attr('complete')) {
    alert('Image is loaded!');
  } else {
    window.setTimeout('doShow()', 100);
  }
};

$('#img_id').attr('src', 'image.jpg');
doShow();

似乎上述作品无处不在......