javascript - 如何在执行函数之前加载一些图像

标签 javascript image promise srcset

我有一个图像 slider 最初位于视口(viewport)之外,然后滑入。我希望在加载前三个图像时发生这种情况,否则用户会在 slider 移入视口(viewport)时看到图像下载。

我尝试使用 Promise 预加载图像,但图像未预加载,并且 slider 初始化函数与图像下载并行运行。

图像具有这种结构:

<img srcset="
  https://www.datocms-assets.com/portrait.jpg?w=600&amp;auto=format 600w,
  https://www.datocms-assets.com/portrait.jpg?w=900&amp;auto=format 900w,
  https://www.datocms-assets.com/portrait.jpg?w=1200&amp;auto=format 1200w" 
  sizes="(min-width: 400px) 80vw, (min-width: 700px) 75vmin, 100vw" 
  src="https://www.datocms-assets.com/portrait.jpg?w=900&amp;auto=format"
/>

脚本:

const loadImage = path => {
  return new Promise(resolve => {
    const img = new Image();
    img.srcset = path;
    img.onload = () => resolve();
  });
};

const sliderEl = document.querySelector('.slider');

const firstImages = Array.from(sliderEl.querySelectorAll('img'))
  .filter((item, i) => i < 3)
  .map(image => image.src);

const loadImg = (...paths) => Promise.all(paths.map(loadImage));
loadImg(...firstImages).then(initSlider(sliderEl));

编辑:您可以在此处查看该网站 https://photography-blog.netlify.com/ 。该问题似乎出现在除 Chrome 之外的大多数浏览器上,并且在第一次访问期间浏览器未缓存照片时。

最佳答案

我认为您的问题可能与 URI https://www.datocms-assets.com/portrait.jpg 有关。返回 404。

如果确实如此,您还应该考虑 loadImage 方法中的 onerror 回调:

const loadImage = path => {
  return new Promise(resolve => {
    const img = new Image();
    img.srcset = path;
    img.onload = () => resolve();
    img.onerror = () => resolve();
  });
};

关于javascript - 如何在执行函数之前加载一些图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57522032/

相关文章:

javascript - 将同步 Map 方法转换为异步特征

javascript - 未使用的 ES6 模块会影响性能吗?

javascript - Yeoman 更改图片文件名,而不是在 HTML 中更新

javascript - 动态选择列表上的单击事件仅适用于 FF

image - 没有这样的图像 : docker. io/openshift/origin-node-problem-detector :v3. 11.0

javascript - q- 何时返回,如 promise 链中的 "defer.resolve(myData); return defer.promise;"VS 只是 "return myData"

javascript - 如何ajax提交来自CKEditor的表单文本区域输入?

r - 在 R 图中使用图像作为区域填充

javascript - 提交后图像出现然后消失

javascript - 如何在循环并进行异步 promise 调用后获取重新格式化的 json 对象