You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测浏览器是否完成所有背景图片下载并获得加载完成通知

问题解决方案

CSS背景图没有原生的加载完成监听事件,我们可以通过主动创建Image对象预加载资源的方式,统计所有图片的加载状态,在全部加载完成后触发通知。

修改后实现代码

function preloadContentScreenshots() {
  const loadPromises = [];
  const container = document.getElementById("content-info-and-screenshot-container");

  // 遍历所有资源创建图片加载任务
  for (var i = 0; i < content.length; i++) {
    var _row = content[i];
    for (var k = 0; k < _row.items.length; k++) {
      var _item = _row.items[k];
      const imgUrl = _item.screenshots["1152x648"];
      
      const loadPromise = new Promise((resolve, reject) => {
        const tempImg = new Image();
        tempImg.src = imgUrl;
        tempImg.onload = () => resolve({
          id: _item.id,
          url: imgUrl
        });
        tempImg.onerror = () => reject(`图片加载失败: ${imgUrl}`);
      });
      loadPromises.push(loadPromise);
    }
  }

  // 监听所有图片加载完成事件
  Promise.all(loadPromises)
    .then((loadedItems) => {
      // 所有图片加载成功后批量创建带背景图的div
      loadedItems.forEach(item => {
        const _div = document.createElement("div");
        _div.id = "content-screenshot-" + item.id;
        _div.classList.add("cs", "hidden");
        _div.style.backgroundImage = `url('${item.url}')`;
        container.appendChild(_div);
      });
      // 此处为所有图片加载完成后的通知位置,可执行你的后续逻辑
      console.log("全部背景图片加载完成");
    })
    .catch(error => {
      // 单张图片加载失败会进入此分支
      console.error(error);
    });
}

可选兼容方案

如果需要即使部分图片加载失败,也要收到全部任务完成的通知,可以把Promise.all替换为Promise.allSettled,再自行过滤加载成功和失败的结果即可。

注意事项

  • 提前用Image对象加载的资源会和CSS背景图共用浏览器缓存,不会产生重复下载,不会额外消耗带宽
  • 浏览器对同域名并发请求数有限制,图片数量过多时会自动排队加载,属于正常浏览器机制

内容的提问来源于stack exchange,提问作者burakk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 22:45:01