아래에 작성한 기능이 오늘날 일반적으로 사용되는 대부분의 브라우저에서 이미지를 미리로드하기에 충분합니까?
function preloadImage(url)
{
var img=new Image();
img.src=url;
}
루프하고 preloadImage
각 URL에 대한 함수를 호출하는 이미지 URL 배열이 있습니다.
답변
예. 모든 주요 브라우저에서 작동합니다.
답변
이것을보십시오 나는 이것이 더 낫다고 생각합니다.
var images = [];
function preload() {
for (var i = 0; i < arguments.length; i++) {
images[i] = new Image();
images[i].src = preload.arguments[i];
}
}
//-- usage --//
preload(
"http://domain.tld/gallery/image-001.jpg",
"http://domain.tld/gallery/image-002.jpg",
"http://domain.tld/gallery/image-003.jpg"
)
출처 : http://perishablepress.com/3-ways-preload-images-css-javascript-ajax/
답변
필자의 경우 onload
이벤트 에 대한 함수에 콜백을 추가하는 것이 유용했습니다 .
function preloadImage(url, callback)
{
var img=new Image();
img.src=url;
img.onload = callback;
}
그리고 이미지에 대한 URL 배열이 콜백으로 미리로드되도록 랩핑하십시오 :
https://jsfiddle.net/4r0Luoy7/
function preloadImages(urls, allImagesLoadedCallback){
var loadedCounter = 0;
var toBeLoadedNumber = urls.length;
urls.forEach(function(url){
preloadImage(url, function(){
loadedCounter++;
console.log('Number of loaded images: ' + loadedCounter);
if(loadedCounter == toBeLoadedNumber){
allImagesLoadedCallback();
}
});
});
function preloadImage(url, anImageLoadedCallback){
var img = new Image();
img.onload = anImageLoadedCallback;
img.src = url;
}
}
// Let's call it:
preloadImages([
'//upload.wikimedia.org/wikipedia/commons/d/da/Internet2.jpg',
'//www.csee.umbc.edu/wp-content/uploads/2011/08/www.jpg'
], function(){
console.log('All images were loaded');
});
답변
CSS2 대안 : http://www.thecssninja.com/css/even-better-image-preloading-with-css2
body:after {
content: url(img01.jpg) url(img02.jpg) url(img03.jpg);
display: none;
}
CSS3 대안 : https://perishablepress.com/preload-images-css3/
(H / T Linh Dam)
.preload-images {
display: none;
width: 0;
height: 0;
background: url(img01.jpg),
url(img02.jpg),
url(img03.jpg);
}
참고 : 컨테이너에 들어있는 이미지는 display:none
사전로드되지 않을 수 있습니다. 아마도 가시성 : 숨김이 더 잘 작동하지만 테스트하지는 않았습니다. 이것을 지적 해 주셔서 감사합니다 Marco Del Valle
답변
몇 가지 가능한 문제를 방지하기 위해 try / catch를 사용하는 것이 좋습니다.
죄송합니다 :
var preloadImage = function (url) {
try {
var _img = new Image();
_img.src = url;
} catch (e) { }
}
표준:
function preloadImage (url) {
try {
var _img = new Image();
_img.src = url;
} catch (e) { }
}
또한 DOM을 좋아하지만 오래된 바보 브라우저는 DOM 사용에 문제가있을 수 있으므로 freedev의 기여와 반대로 IMHO를 피하십시오. Image ()는 오래된 휴지통 브라우저에서 더 잘 지원됩니다.
답변
이 접근법은 조금 더 정교합니다. 여기에 미리로드 된 모든 이미지를 컨테이너에 저장합니다 .div 일 수 있습니다. 그리고 이미지를 표시하거나 DOM 내에서 올바른 위치로 옮길 수 있습니다.
function preloadImg(containerId, imgUrl, imageId) {
var i = document.createElement('img'); // or new Image()
i.id = imageId;
i.onload = function() {
var container = document.getElementById(containerId);
container.appendChild(this);
};
i.src = imgUrl;
}
여기에 시도해보십시오. 댓글도 추가했습니다.
답변
const preloadImage = src =>
new Promise(r => {
const image = new Image()
image.onload = r
image.onerror = r
image.src = src
})
// Preload an image
await preloadImage('https://picsum.photos/100/100')
// Preload a bunch of images in parallel
await Promise.all(images.map(x => preloadImage(x.src)))