[javascript] JavaScript로 이미지 미리로드

아래에 작성한 기능이 오늘날 일반적으로 사용되는 대부분의 브라우저에서 이미지를 미리로드하기에 충분합니까?

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)))