如何创建 JavaScript 回调以了解何时加载图像?

IT技术 javascript image callback loading
2021-01-18 21:22:35

我想知道图像何时完成加载。有没有办法通过回调来做到这一点?

如果没有,有没有办法做到这一点?

6个回答

.complete + 回调

这是一种符合标准的方法,没有额外的依赖,等待时间不会超过必要的:

var img = document.querySelector('img')

function loaded() {
  alert('loaded')
}

if (img.complete) {
  loaded()
} else {
  img.addEventListener('load', loaded)
  img.addEventListener('error', function() {
      alert('error')
  })
}

来源:http : //www.html5rocks.com/en/tutorials/es6/promises/

@ThomasAhle 不能,因为浏览器只会在事件队列旋转时触发 load 事件。也就是说,load事件监听器必须在一个else子句中,因为它img.complete可以在load事件被触发之前变为真,因此如果不是,你可能会loaded调用两次(注意这相对可能会改变,img.complete只有当事件发生时才变为真火灾)。
2021-03-10 21:22:35
我想这只会是并行代码的问题,大多数 javascript 可能不是..
2021-03-11 21:22:35
如果图像在img.complete通话和addEventListener通话之间完成,这会出错吗?
2021-03-17 21:22:35
@ThomasAhle 我不是专家,但这似乎是可能的。让我们看看是否有人有解决方案。
2021-03-29 21:22:35

Image.onload()通常会起作用。

要使用它,您需要确保在设置 src 属性之前绑定事件处理程序。

相关链接:

示例用法:

    window.onload = function () {

        var logo = document.getElementById('sologo');

        logo.onload = function () {
            alert ("The image has loaded!");		
        };

        setTimeout(function(){
            logo.src = 'https://edmullen.net/test/rc.jpg';         
        }, 5000);
    };
 <html>
    <head>
    <title>Image onload()</title>
    </head>
    <body>

    <img src="#" alt="This image is going to load" id="sologo"/>

    <script type="text/javascript">

    </script>
    </body>
    </html>

@JasonBunting 你在看什么让你认为该load事件无效?html.spec.whatwg.org/multipage/webappapis.html#handler-onloadonload 事件处理程序的定义
2021-03-16 21:22:35
@quemeful 这就是为什么它被称为“一个例子”。
2021-03-30 21:22:35
@gsnedders - 你意识到,我假设,当我写那条评论时,我指的是现存的标准,而不是你指出的标准,它比 4.5 年更新。如果你当时问过,我可以指出它,也许。这就是网络的本质,对吧?东西变旧或移动或修改等。
2021-03-30 21:22:35
为什么等待 5 秒来设置源似乎是个坏主意?
2021-04-04 21:22:35
仅供参考:根据 W3C 规范,onload 不是 IMG 元素的有效事件。显然浏览器确实支持它,但是如果您关心规范并且不是 100% 确定您要定位的所有浏览器都支持这一点,您可能需要重新考虑它或至少记住它。
2021-04-05 21:22:35

您可以使用 Javascript 图像类的 .complete 属性。

我有一个应用程序,我将多个 Image 对象存储在一个数组中,这些对象将动态添加到屏幕上,并且在加载它们时,我将更新写入页面上的另一个 div。这是一个代码片段:

var gAllImages = [];

function makeThumbDivs(thumbnailsBegin, thumbnailsEnd)
{
    gAllImages = [];

    for (var i = thumbnailsBegin; i < thumbnailsEnd; i++) 
    {
        var theImage = new Image();
        theImage.src = "thumbs/" + getFilename(globals.gAllPageGUIDs[i]);
        gAllImages.push(theImage);

        setTimeout('checkForAllImagesLoaded()', 5);
        window.status="Creating thumbnail "+(i+1)+" of " + thumbnailsEnd;

        // make a new div containing that image
        makeASingleThumbDiv(globals.gAllPageGUIDs[i]);
    }
}

function checkForAllImagesLoaded()
{
    for (var i = 0; i < gAllImages.length; i++) {
        if (!gAllImages[i].complete) {
            var percentage = i * 100.0 / (gAllImages.length);
            percentage = percentage.toFixed(0).toString() + ' %';

            userMessagesController.setMessage("loading... " + percentage);
            setTimeout('checkForAllImagesLoaded()', 20);
            return;
        }
    }

    userMessagesController.setMessage(globals.defaultTitle);
}
检查完成的问题是从 IE9 开始,OnLoad 事件在加载所有图像之前被触发,现在很难找到检查功能的触发器。
2021-04-02 21:22:35
我以前在工作中使用过类似的代码。这适用于所有浏览器。
2021-04-05 21:22:35

生命对于 jquery 来说太短暂了。

function waitForImageToLoad(imageElement){
  return new Promise(resolve=>{imageElement.onload = resolve})
}

var myImage = document.getElementById('myImage');
var newImageSrc = "https://pmchollywoodlife.files.wordpress.com/2011/12/justin-bieber-bio-photo1.jpg?w=620"

myImage.src = newImageSrc;
waitForImageToLoad(myImage).then(()=>{
  // Image have loaded.
  console.log('Loaded lol')
});
<img id="myImage" src="">

这是一个很好的答案,但我认为您甚至不需要那么多代码。你只是通过添加srcwith JS让它看起来很混乱
2021-03-15 21:22:35
为什么要将 src 存储到一个新变量中,只是为了在下一行使用它?如果简洁是你的目标,那就是一种反模式。myImage.src = https://pmchollywoodlife.files.wordpress.com/2011/12/justin-bieber-bio-photo1.jpg?w=620诀窍。
2021-03-29 21:22:35
时间是编程中的一个巨大限制。根据我的经验,编写可读(虽然有时很长)的代码会带来巨大的时间收益。
2021-03-30 21:22:35

您可以在 jQuery 中使用 load() 事件,但如果从浏览器缓存加载图像,它不会总是触发。这个插件https://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js可以用来解决这个问题。