html
<img
width="1024"
src="https://placehold.it/64x48.jpg"
data-src-defer="https://images.unsplash.com/photo-1570280406792-bf58b7c59247?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1486&q=80"
alt="image 1"
/>
<img
width="1024"
src="https://placehold.it/64x48.jpg"
data-src-defer="https://images.unsplash.com/photo-1557053964-d42e8e29cb27?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1500&q=80"
alt="image 2"
/>
JS
function deferImgs() {
Array
.from(document.querySelectorAll("img[data-src-defer]"))
.forEach((element) => {
element.setAttribute("src", element.dataset.srcDefer);
});
}
window.addEventListener("load", deferImgs());
==================================================== ===============
我正在尝试通过此编辑来满足 Farrukh 的要求。
我尽力做到最好,但不幸的是英语只是我说的第三语言。而且我不是语言天才。:D
这个 js 代码片段说明了一些大图片的延迟加载。这不是一个实际的实现。图像之间的尺寸差异是故意巨大的。这是因为测试必须是说明性的。您可以通过浏览器开发工具页面监控其运行情况。F12 > 网络选项卡 > 速度设置下拉列表 测试的理想网络速度在 1 - 3MB/s 之间(网络速度有些慢)。您可能需要多次运行测试,因此您可以看到,在这种情况下,加载图像的顺序不受控制,而是取决于传输。因为它不受监管,所以无法预测哪个图像会先到达。
我们首先将一个小图像加载到一个大占位符中。(图片:64x48.jpg > 占位符宽度=“1024”)。
querySelectorAll() 方法返回一个静态节点列表。乍一看,这个节点列表看起来像一个数组,但事实并非如此。
这是一个类似数组的对象:
document.querySelectorAll("img[data-src-defer]")
Array.from() 方法可以从这个对象创建一个新的数组实例。现在可以在这个数组上执行 forEach 方法。forEach() 方法为数组的每个元素执行一次提供的函数。
在这种情况下,数组的每个元素都被传递给这个函数一次:
(element) => {
element.setAttribute("src", element.dataset.srcDefer);
}
此函数将图像标签的 src="" 属性的值设置为同一图像标签的数据集的值。
src="https://placehold.it/64x48.jpg";
data-src-defer="https://images.unsplash.com/photo-1570280406792-bf58b7c59247?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1486&q=80";
src = data-src-defer;
So finally:
src="https://images.unsplash.com/photo-1570280406792-bf58b7c59247?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=1486&q=80";