javascript - 如何在执行函数之前加载一些图像
问题描述
我有一个图像滑块,最初位于视口之外,然后滑入。我希望在加载前三个图像时发生这种情况,否则用户会在滑块移动到视口时看到图像正在下载。
我尝试使用 Promise 预加载图像,但图像没有预加载,并且滑块初始化函数与图像下载并行运行。
图像具有这种结构:
<img srcset="
https://www.datocms-assets.com/portrait.jpg?w=600&auto=format 600w,
https://www.datocms-assets.com/portrait.jpg?w=900&auto=format 900w,
https://www.datocms-assets.com/portrait.jpg?w=1200&auto=format 1200w"
sizes="(min-width: 400px) 80vw, (min-width: 700px) 75vmin, 100vw"
src="https://www.datocms-assets.com/portrait.jpg?w=900&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的事实有关。
如果确实如此,您还应该考虑方法onerror
中的回调loadImage
:
const loadImage = path => {
return new Promise(resolve => {
const img = new Image();
img.srcset = path;
img.onload = () => resolve();
img.onerror = () => resolve();
});
};
推荐阅读
- wasm-bindgen - 如何使用 wasm-bindgen - 导入具有多个模块级别的 js
- python - Ansible:ImportError:未安装请求库
- plesk - .NET Core 3.1 无法在 Plesk 自包含上托管,出现错误:500 - 内部服务器错误和 HTTP 错误 502.5 - 进程失败
- mysql - 使用 Laravel 在同一行中插入数据
- android - 用于原生广告的 Facebook Audience Network setAdListner 已被弃用,有什么新方法可以做到这一点?
- git - 在没有远程存储库的情况下将 svn 迁移到 git?
- npm - 使用 pacman 命令更新 Manjaro 系统时出错 - npm 冲突文件错误消息
- android - 编译器在尝试获取对可组合函数的引用时抛出警告
- powershell - 将列表与分配了标签的单独列表进行比较
- javascript - 使用 Flask 发送 JSON 并使用 JavaScript 解析