jQuery 或 Javascript 检查图像是否已加载

IT技术 javascript jquery
2021-02-21 18:14:29

我知道 Stackoverflow 上有很多这些,但我还没有在最新版本的 jquery (1.10.2) 中找到适合我的。

我确实尝试过:

$(".lazy").load(function (){}

但我相信经过一些研究.load用于检测图像加载在 jQuery 1.8 中已被弃用。我需要做的是在加载图像后触发图像调整大小功能。我无法控制 HTML,目前我必须通过 jQuery 添加图像尺寸,方法是.attr()在页面加载时附加一个属性(via ),以便我可以使用lazyload js。

问题是我需要一种准确的方法来推迟我所有的各种脚本,直到图像正确加载,否则函数有时会在每个图像加载之前触发。我曾尝试使用,$(window).load(function (){});但有时在每个图像加载之前它仍然会触发。

5个回答

我通常这样做:

var image = new Image();
image.onload = function () {
   console.info("Image loaded !");
   //do something...
}
image.onerror = function () {
   console.error("Cannot load image");
   //do something else...
}
image.src = "/images/blah/foo.jpg";

请记住,加载是异步的,因此您必须在onloadonerror事件中继续脚本

是的,一点没错。静态数组只是一个例子,您可以在启动之前读取所有 src,然后启动预加载功能。
2021-04-17 18:14:29
如果我的列表是动态的,我可以创建一个变量来查看所有传入图像的 src 属性,然后以这种方式应用它?
2021-04-21 18:14:29
如果我正在加载大量图像,我认为我需要引用所有图像路径吗?
2021-05-01 18:14:29
嗯,这取决于你的想法。如果该过程需要在开始之前加载所有图像,那么是的,您必须将它们全部加载。
2021-05-11 18:14:29

.complete图像对象还有一个有用的属性,如果.src<img>在附加任何事件侦听器之前已经设置了则可以使用它

var img=document.getElementById('myimg');
var func=function(){
    // do your code here
    // `this` refers to the img object
};
if(img.complete){ 
    func.call(img);
}
else{ 
    img.onload=func; 
}

参考:http : //www.w3schools.com/jsref/prop_img_complete.asp

这正是我需要捕捉通过$(xx).html()调用加载的图像的结尾
2021-05-04 18:14:29

我会给需要这个约束的图像一个类,比如mustLoad

<img class="mustLoad" src="..." alt="" />

然后创建一个通用的图像加载处理函数,例如:

$('img.mustLoad').on('load',function(){
        /* Fire your image resize code here */
});

编辑

针对您对.load()上述.load()弃用的评论已弃用,.on('load') 以减少onLoad事件和 Ajax 加载之间的歧义

在等待加载多张图片的情况下:

var images = $("#div-with-images img");
var unloaded = images.length;
images.on('load', function(){
  -- unloaded;
  if (!unloaded) {
    // here all images loaded, do your stuff
  }
});

我需要做的是在加载图像后触发图像调整大小功能。

您确定需要加载图像吗?在调整图像大小之前等待图像加载可能会导致页面布局出现大幅跳跃,尤其是当图像具有较大的文件大小时,例如动画 GIF。

通常,对于图像调整大小,您只需要知道图像的内在尺寸。虽然没有事件告诉您这一点,但轮询图像中的数据很容易。像这样的事情可能特别有效:

<img src="..." data-resizeme="123" />
(function() {
    var images, l, i, tmp;
    if( document.querySelectorAll) {
        images = [].slice.call(document.querySelectorAll("img[data-resizeme]"),0);
    }
    else {
        tmp = document.getElementsByTagName("img");
        images = [];
        // browser compatibility is fun!
        for( i=tmp.length-1; i>=0; i--) {
            if( tmp[i].getAttribute("data-resizeme")) images.unshift(tmp[i]);
        }
    }

    for( i=images.length-1; i>=0; i--) {
        images[i].onload = resizeImage;
        images[i].onerror = cancelImageResize;
    }
    var timer = setInterval(function() {
        for( i=images.length-1; i>=0; i--) {
            if( images[i].width) {
                resizeImage.call(images[i]);
                images[i].onload = null;
                cancelImageResize.call(images[i]);
            }
        }
        if( images.length == 0) clearInterval(timer);
    },100); // adjust granularity as needed - lower number is more responsive.

    function cancelImageResize() {
        var i;
        for( i=images.length-1; i>=0; i--) {
            if( images[i] == this) {
                images.splice(i,1);
                break;
            }
        }
    }

    function resizeImage() {
        console.log("Image "+this.src+" is "+this.width+"x"+this.height);
    }
})();

希望这可以帮助!

@DarkoRomanov Erm ...您如何建议对没有关联事件处理程序的内容进行轮询?
2021-04-15 18:14:29
该事件是 Image DOM 对象的 onload,您只需要一个包含每个图像的 url 的数组和一个指向当前图像的简单指针。当图像完成加载时,您再次调用相同的加载函数,增加指针。见小提琴jsfiddle.net/93Q7Y
2021-05-04 18:14:29
使用 setInterval 制作轮询函数非常非常糟糕,这是管理异步函数的最糟糕的方式,而是使用回调系统。
2021-05-06 18:14:29
data-resizeme="123" - 特别是 123,我希望它调整到的图像大小?
2021-05-09 18:14:29
你可以这样做。resizeImage函数中,使用parseInt(this.getAttribute("data-resizeme"),10)获取值,然后应用它。关键是在那里有一个属性。你用它来做什么取决于你。
2021-05-13 18:14:29