배경 이미지가로드되었는지 어떻게 확인할 수 있습니까?


154

body 태그에 배경 이미지를 설정하고 다음과 같은 코드를 실행하고 싶습니다.

$('body').css('background-image','http://picture.de/image.png').load(function() {
    alert('Background image done loading');
    // This doesn't work
});

배경 이미지가 완전히로드되었는지 어떻게 확인할 수 있습니까?


4
이벤트 Image()가있는 객체에 동일한 URL을 지정하십시오 onload.
Shadow Wizard는 당신을위한 귀입니다.

2
CSS URL을 감싸십시오url()
bluescrubbie

답변:


274

이 시도:

$('<img/>').attr('src', 'http://picture.de/image.png').on('load', function() {
   $(this).remove(); // prevent memory leaks as @benweet suggested
   $('body').css('background-image', 'url(http://picture.de/image.png)');
});

그러면 메모리에 새 이미지가 생성되고 load 이벤트를 사용하여 src가로드되는시기를 감지합니다.


10
아무 이유없이 이미지가 두 번로드 된 것 같습니다.
HyderA

49
@gAMBOOKa 브라우저 메모리에 남아 있기 때문에 한 번만로드됩니다. 페이지 상단에 숨겨진 이미지를 넣은 다음 CSS로 설정하면 CSS 파일보다 먼저 이미지 다운로드가 시작됩니다.이를 사전로드라고합니다.
jcubic

4
확실하지 않지만 캐시를 참조한다고 생각합니다. 자산이 저장되는 브라우저 메모리와 같은 것은 없다고 생각합니다. 캐시를 참조하는 경우 추가 HTTP 요청을 추가하고 있으며 모든 클라이언트에서 캐시를 사용하도록 설정하지 않았을 수 있습니다.
HyderA 2012

7
jquery :가있는 모든 페이지에 이것을 입력 javascript:void($('<img/>').attr('src', 'http://farm6.static.flickr.com/5049/5220175127_5693faf952.jpg').load(function() { $('html').css('background-image', 'url(http://farm6.static.flickr.com/5049/5220175127_5693faf952.jpg)'); }))하고 Firebug에서 HTTP 요청을 확인하십시오. 이 이미지가 다른 탭에서 열린 상태로 깜박임 페이지를 열면 HTTP 요청을 수행하지 않고이 그림을 즉시 보여줍니다. 캐시를 지우고 실행할 때 하나의 요청이있었습니다.
jcubic 2019

26
사이의 비교 이 테스트 하고 이것 당신이 호출 할 필요가 있음을 나타냅니다 .remove()$('<img/>')메모리 누수를 방지하기 위해 객체입니다. 첫 번째 테스트에서는 메모리 소비량이 안정되고 두 번째 테스트에서는 메모리가 증가합니다. Chrome 28에서 몇 시간 동안 실행 한 후 첫 번째 테스트는 80MB, 두 번째 테스트는 270MB입니다.
benweet

23

나는이 JQuery와 플러그인이 라는 waitForImages배경 이미지를 다운로드 한 때를 감지 할 수 있습니다.

$('body')
  .css('background-image','url(http://picture.de/image.png)')
  .waitForImages(function() {
    alert('Background image done loading');
    // This *does* work
  }, $.noop, true);

이 플러그인은 each콜백을 사용하여로드 진행률을 표시 할 수도 있습니다 .
Soviut

1
@ alex, 클래스의 각 요소에 대한 각 배경 이미지를 어떻게 확인해야합니까? 나는 이것을 시도했지만 제대로하지 않는 것 같습니다. $ ( '. user_main_photo_thumb'). waitForImages (function () {$ (this) .parents ( '. photoThumbFrame'). delay (1000) .slideDown ();}, function (loaded, count, success) {});
Relm

@Relm 올바르게 사용하고 있지 않습니다. 두 번째 콜백은 이미지 당입니다. 또한 delay()그렇게 작동하지 않습니다.
alex

16

이 같은:

var $div = $('div'),
  bg = $div.css('background-image');
  if (bg) {
    var src = bg.replace(/(^url\()|(\)$|[\"\'])/g, ''),
      $img = $('<img>').attr('src', src).on('load', function() {
        // do something, maybe:
        $div.fadeIn();
      });
  }
});

안녕하세요 ... bg.replace를로 설정했지만 작동하는 것 같습니다 bg.replace( ... , my_src ). 그러나 내 질문은 : 일단 $ ( '<img>') <img>이로 드 되면 정확히 어떻게됩니까 ... 실제로는 실제가 아니라는 것을 의미합니다. 단지 더미 자리 표시 자입니다.
dsdsdsdsd

권리. 는 <img>DOM에 삽입되지 않습니다; 이미지 파일을 캐시에로드 할 때 브라우저를 "바보"하는 데 사용됩니다.
Colin

jQuery를 호출하지 않으려는 경우 유용
vwvan


8

프리 로더를 추가하고 배경 이미지를 설정 한 다음 이벤트 리스너와 함께 가비지 수집을 위해 설정하는 순수 JS 솔루션 :

짧은 버전 :

const imageUrl = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
let bgElement = document.querySelector("body");
let preloaderImg = document.createElement("img");
preloaderImg.src = imageUrl;

preloaderImg.addEventListener('load', (event) => {
    bgElement.style.backgroundImage = `url(${imageUrl})`;
    preloaderImg = null;
});

좋은 불투명도 전환으로 조금 더 길다 :

const imageUrl = "https://www.google.com/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png";
let bgElement = document.querySelector(".bg-lazy");
bgElement.classList.add("bg-loading");
let preloaderImg = document.createElement("img");
preloaderImg.src = imageUrl;

preloaderImg.addEventListener('load', (event) => {
  bgElement.classList.remove("bg-loading");
  bgElement.style.backgroundImage = `url(${imageUrl})`;
  preloaderImg = null;
});
.bg-lazy {
  height: 100vh;
  width: 100vw;
  transition: opacity 1s ease-out;
}

.bg-loading {
  opacity: 0;
}
<div class="bg-lazy"></div>


3
과소 평가 솔루션.
톰 톰슨

1
덕분에 톰 @TomThomson, 나는 그것을 고정, 제대로 이미지 전환 didnt 한 일을 발견
godblessstrawberry

6

다음은 정확하게 수행 할 수 있도록 만든 작은 플러그인입니다. 여러 배경 이미지와 여러 요소에서도 작동합니다.

기사를 읽다:

http://catmull.uk/code-lab/background-image-loaded/

또는 플러그인 코드로 바로 이동하십시오.

http://catmull.uk/downloads/bg-loaded/bg-loaded.js

플러그인을 포함시킨 다음 요소에서 호출하십시오.

<script type="text/javascript" src="http://catmull.uk/downloads/bg-loaded/bg-loaded.js"></script>
<script type="text/javascript">
   $('body').bgLoaded();
</script>

플러그인을 다운로드하여 자체 호스팅에 저장하십시오.

기본적으로 배경이로드되면 일치하는 각 요소에 추가 "bg-loaded"클래스를 추가하지만 다음과 같은 다른 함수를 전달하여 쉽게 변경할 수 있습니다.

<script type="text/javascript" src="http://catmull.uk/downloads/bg-loaded/bg-loaded.js"></script>
<script type="text/javascript">
   $('body').bgLoaded({
      afterLoaded : function() {
         alert('Background image done loading');
      }
   });
</script>

작동 방식을 보여주는 코드 펜이 있습니다.

http://codepen.io/catmull/pen/Lfcpb


3

나에게 더 잘 맞는 솔루션을 찾았으며 여러 이미지 (이 예제에서는 설명하지 않음)와 함께 사용할 수있는 이점이 있습니다.

이 질문에 대한 @adeneo의 답변에서 :

이와 같이 배경 이미지가있는 요소가있는 경우

<div id="test" style="background-image: url(link/to/image.png)"><div>

이미지 URL을 가져 와서 onload 핸들러를 사용하여 자바 스크립트의 이미지 객체에 사용하여 배경이로드 될 때까지 기다릴 수 있습니다.

var src = $('#test').css('background-image');
var url = src.match(/\((.*?)\)/)[1].replace(/('|")/g,'');

var img = new Image();
img.onload = function() {
    alert('image loaded');
}
img.src = url;
if (img.complete) img.onload();

2

나는 이것을 가능하게하기 위해 순수한 자바 스크립트 해킹을했다.

<div class="my_background_image" style="background-image: url(broken-image.jpg)">
<img class="image_error" src="broken-image.jpg" onerror="this.parentElement.style.display='none';">
</div>

또는

onerror="this.parentElement.backgroundImage = "url('image_placeHolder.png')";

CSS :

.image_error {
    display: none;
}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.