const images = document.querySelectorAll("img"); function loadImage(src) { let p = new Promise(function (resolve, reject) { let img = new Image(); img.onload = function () {//加载时执行resolve函数 resolve(img); } img.onerror = function () { reject(src); } img.src = src; }) return p; } // 传给IntersectionObserver的回调函数 // 在目标元素能看见时触发一次,目标元素看不见了时再触发一次 const observer = new IntersectionObserver(entries => { entries.forEach(async entry => { if (entry.isIntersecting) { const image = entry.target; const data_src = image.getAttribute("data-src"); let p = await loadImage(data_src) image.setAttribute("src", p.src); // 图片被加载后取消观察 observer.unobserve(image); } }); }); images.forEach(image => { observer.observe(image); });