const preloadImg = (...urls) => {
const toolDiv = document.createElement('div');
toolDiv.style = 'display: none';
const load = url => {
return new Promise(res => {
const img = new Image();
img.src = url;
img.onload = () => res(img);
});
};
const getImgs = imgs => {
const promises = imgs.map(async url => {
const img = await load(url);
toolDiv.appendChild(img);
});
return Promise.all(promises);
}
getImgs(urls).then(() => {
document.body.appendChild(toolDiv);
});
};
Вы видите <div>
, содержащий все эти изображения в Elements
, и пути верны:
<div style="display: none"> // I try removing <display: none> but not working, either
<img src="img/329b774421235a3b27d7142b1707ea01.jpg">
<img src="img/33df62feaa1871d7ff4c2b933aa82992.jpg">
<img src="img/5681a01b46e89618d96ff523dc81a1fb.jpg">
<img src="img/183ad681c899a84c82e288ac8ad30604.jpg">
<img src="img/1d9c8fdb875c31cbfa1f83e11a7038af.jpg">
<img src="img/71b1abb6a445059bf43463ab80e75506.jpg">
<img src="img/40734ae2e8255713e76814eba786f018.jpg">
<img src="img/8c40e3bdea0a863b76d888ad9952cf74.jpg">
<img src="img/8aa56b4e08ef9a40c92e6e0609991280.jpg">
</div>
Также в Network
вы можете видеть, что все запросы были выбран правильно (скриншот с Edge 18, где предварительная загрузка не работает):
Предварительная загрузка asyn c работает только в Chrome (и Opera) любые другие браузеры (ff, edge, ie) приводят к мерцанию, как будто они не загружены вообще (но при отображении нет никакого дополнительного http-запроса, что означает, что эти изображения были извлечены и кэшированы) .
Я проверяю поддержку браузером Promise
, Promise.all
и async await
и никаких проблем.
Однако традиционная синхронная предварительная загрузка отлично работает во всех браузерах:
urls.forEach(url => {
const img = new Image();
img.src = url;
toolDiv.appendChild(img);
});
document.body.appendChild(toolDiv);
Эти изображения были обработаны загрузчиком файлов Webpack с помощью Babel (core- js & runtime), но я думаю, что это не проблема.
Нужна помощь, спасибо! !
Обновление: я просто одолжил у моего соседа по комнате iPhone 8 и не мерцал.
Я сделаю это яснее Вот. Эти изображения отображаются в качестве фоновых изображений, переключающихся по классам css и запускаемых колесом мыши, например:
/*.css */
.img1::before,
.img1::after {
background-image: url(../img/img1.jpg); /* Would be ../img/dasdfsafadasdasda.jpg after file-loader */
}
.img2::before,
.img2::after {
background-image: url(../img/img2.jpg);
}
<!-- .html -->
<aside class="img1" id="aside"></aside>
// .js
something.onwheel = () => {
document.getElementById('aside').className = 'img2';
};
Переключение изображений по переименованию классов.
Но я все еще думаю, что этот переключатель классов тоже не проблема.
Окончательное обновление: метод @ Kaiido работает. Эта проблема вызвана частичной доступностью извлеченных изображений. Для полной доступности требуется следующий процесс декодирования.
WHATWG