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

121 javascript image loading callback

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

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

Cir*_*四事件 130

.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')
  })
}
Run Code Online (Sandbox Code Playgroud)

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

  • @ThomasAhle 不能,因为浏览器只会在事件队列旋转时触发 load 事件。也就是说,`load` 事件侦听器 * 必须* 位于 `else` 子句中,因为 `img.complete` 可以在 `load` 事件触发之前变为真,因此如果不是,你可能已经 `loaded ` 调用了两次(请注意,这相对可能会发生变化,以至于 `img.complete` 仅在事件触发时才变为真)。 (5认同)
  • 如果图像在`img.complete`调用和`addEventListener`调用之间完成,这会出错吗? (3认同)

kep*_*aro 65

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);
    };
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:根据W3C规范,onload不是IMG元素的有效事件.显然浏览器确实支持它,但是如果你关心规范并且不是100%确定你想要定位的所有浏览器都支持这个,你可能想重新考虑它或至少记住它. (24认同)
  • @quemeful这就是为什么它被称为"一个例子". (8认同)
  • @gsnedders - 你会意识到,我认为,当我写这篇评论时,我指的是现存的标准,而不是你指出的标准,这是4.5年的新标准.那你当时问过,我可能已经指出过了.这就是网络的本质,对吧?事情变老或被移动或被修改等. (4认同)
  • 为什么等待5秒来设置源似乎是一个坏主意? (3认同)
  • @JasonBunting您在看什么,使您认为`load`事件无效?https://html.spec.whatwg.org/multipage/webappapis.html#handler-onload是`onload`事件处理程序的定义。 (3认同)

Jon*_*Oro 20

您可以使用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);
}
Run Code Online (Sandbox Code Playgroud)

  • 检查完成的问题是从IE9开始,在加载所有图像之前触发OnLoad事件,现在很难找到检查功能的触发器. (2认同)

jim*_*mig 10

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


Ida*_*ker 8

生活对于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')
});
Run Code Online (Sandbox Code Playgroud)
<img id="myImage" src="">
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*sky 5

这是 jQuery 的等效项:

var $img = $('img');

if ($img.length > 0 && !$img.get(0).complete) {
   $img.on('load', triggerAction);
}

function triggerAction() {
   alert('img has been loaded');
}
Run Code Online (Sandbox Code Playgroud)


Saj*_*jad 5

如果目标是在浏览器渲染图像后设置 img 的样式,您应该:

const img = new Image();
img.src = 'path/to/img.jpg';

img.decode().then(() => {
/* set styles */
/* add img to DOM */ 
});
Run Code Online (Sandbox Code Playgroud)

因为首先是浏览器loads the compressed version of image,然后decodes it是最后paints它。因为在浏览器具有img 标签后没有任何事件paint可供您运行逻辑。decoded