如何检测图像何时在浏览器中完成渲染(即绘制)?

And*_*iga 29 javascript image dom-events

在Web应用程序上,我需要处理大量高分辨率图像,这些图像会动态添加到DOM树中.它们已预先加载,然后添加到页面中.

检测这样的图像何时完成加载是一回事,为此我使用了该load事件,但是如何使用Javascript 检测它何时在浏览器中完成呈现?使用高分辨率图像时,实际的绘画过程可能需要花费大量时间,因此了解它何时结束非常重要.

小智 14

我用requestAnimationFrame来做这个伎俩.加载图像后,它将在下一个动画帧期间渲染.因此,如果您等待两个动画帧,您的图像将被渲染.

function rendered() {
    //Render complete
    alert("image rendered");
}

function startRender() {
    //Rendering start
    requestAnimationFrame(rendered);
}

function loaded()  {
    requestAnimationFrame(startRender);
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/4fg3K/1/

  • 它不适用于任何主要浏览器(在Edge 15,Chrome 58和FireFox 53上测试):在图像完成绘制之前显示警告框. (3认同)
  • 当我将代码放入图像`onload` 回调时,这实际上对我有用。在最新的 Chrome 和 FF、IE 11、iOS 10.3.3 上的 Safari 中测试,它在任何地方都有效(在图像显示在屏幕上后出现警报)。我正在测试的图像也很大(大约 2 MB 桌面和 500 KB 移动)。 (3认同)

Paw*_*weł 6

我有同样的问题。我已经创建了带有进度条的预加载器页面。当图像加载时,白色背景预加载页面平滑消失opacity: 0,但图像仍然没有渲染。

setInterval当图像加载(但未渲染)时,我终于使用了, 。在间隔中我检查naturalWidthnaturalHeight属性(支持:IE9+)。最初它等于0,并且当渲染图像时它显示其当前的宽度和高度。

const image = document.getElementById('image');

image.src = "https://cdn.photographylife.com/wp-content/uploads/2014/06/Nikon-D810-Image-Sample-1.jpg";

image.onload = function () {
  console.log('Loaded: ', Date.now());
  const interval = setInterval(() => {
    if (image.naturalWidth > 0 && image.naturalHeight > 0) {
      clearInterval(interval);
      rendered();
    }
  }, 20);
}

function rendered() {
  console.log('Rendered: ', Date.now());
}
Run Code Online (Sandbox Code Playgroud)
img{
  width: 400px;
}
Run Code Online (Sandbox Code Playgroud)
<img id="image"/>
Run Code Online (Sandbox Code Playgroud)

  • 使用“naturalHeight”和“naturalWidth”来检测绘图根本不可靠。在我使用 Firefox 52、Chromium 18 和 Chromium 91 进行的测试中,在图像的“onload”触发之前,“naturalWidth”和“naturalHeight”设置为 &gt;0。两个 Chromium 版本都会在图像初始绘制之前引发“onload”,而 Firefox 52 在初始绘制之后引发“onload”。 (3认同)

Ale*_*ack -6

您需要标签onload上的事件<img>。例如:

function loadImage () {
  alert("Image is loaded");
}
<img src="w3javascript.gif" onload="loadImage()" width="100" height="132">
Run Code Online (Sandbox Code Playgroud)

来源

如果图像是另一个元素的背景,则在后台加载图像(使用简单的 Ajax GET 请求),当结果返回时,在加载后设置背景。

  • 这不是我所追求的。正如杰克也指出的那样:渲染**(绘画)!=加载** (2认同)