로드 된 이미지에 대한 jQuery 이벤트


96

모든 이미지가 jQuery 이벤트를 통해로드되는시기를 감지 할 수 있습니까?

이상적으로는

$(document).idle(function()
{
}

또는

$(document).contentLoaded(function()
{
}

그러나 나는 그런 것을 찾을 수 없습니다.

다음과 같은 이벤트를 첨부 할 생각 :

$(document).ready(function()
{
    var imageTotal = $('img').length;
    var imageCount = 0;        
    $('img').load(function(){if(++imageCount == imageTotal) doStuff();});
}

그러나 이미지가로드되지 않으면 이것이 중단됩니까? 메서드를 적절한시기에 호출하는 것은 매우 중요합니다.


9
onload 이벤트 : $ (window) .load (doStuff)를 사용하지 않는 이유는 무엇입니까? 그러나 Onload는 이미지뿐만 아니라 다른 리소스 (예 : 스크립트, 스타일 시트 및 플래시)도 기다릴 것입니다.
moff

코드 샘플에서와 같이 모든 img 태그에로드 이벤트를 연결하는 것이 작동해야합니다. 이미지로드에 실패하면 doStuff ()가 호출되지 않지만 모든 이미지를로드해야한다는 요구 사항을 감안할 때 합리적으로 보입니다.
Steve Goodman

2
.load () 메소드는 jQuery 1.8부터 사용되지 않습니다. 이것을 확인하십시오 : stackoverflow.com/questions/3877027/…
fiorix

답변:


116

jQuery의 문서 에 따라 이미지와 함께로드 이벤트를 사용하는 데는 여러 가지주의 사항이 있습니다. 다른 답변에서 언급했듯이 ahpi.imgload.js 플러그인이 손상되었지만 연결된 Paul Irish 요점은 더 이상 유지되지 않습니다.

Paul Irish에 따르면 이미지로드 완료 이벤트를 감지하기위한 표준 플러그인 은 다음과 같습니다.

https://github.com/desandro/imagesloaded


4
이것은 여러 이미지, 캐시 된 이미지, 브라우저의 문제, 깨진 이미지를 처리하는 해답이며 최신입니다. 아름다운.
Yarin 2012 년

7
오늘 테스트했습니다. 2 분 만에 실행되었습니다.
CodeToad

@Yarin, 좋은 문서, 사용하기 쉬움, 다중, 캐시, 손상 및 최신에 동의하십시오. 그것을 사랑하십시오.
johntrepreneur 2013


1
IE7에서 imagesLoaded가 작동 하도록 빠르고 간단한 2 줄 수정 .
johntrepreneur

63

모든 이미지가 아닌 특정 이미지 (예 : DOM이 이미 완료된 후 동적으로 대체 한 이미지)를 확인하려면 다음을 사용할 수 있습니다.

$('#myImage').attr('src', 'image.jpg').on("load", function() {  
  alert('Image Loaded');  
});  

70
load()이미지가 이미로드 된 경우 트리거되지 않으므로 주의하십시오 . 이는 이미지가 사용자의 브라우저 캐시에있을 때 쉽게 발생할 수 있습니다. 를 사용하여 이미지가 이미로드되었는지 확인할 수 있으며 $('#myImage').prop('complete'), 이미지가로드되면 true를 반환합니다.
Blaise

6
a) 질문에 답하지 않고 b) 그 밖에도 좋지 않은 해결책을 제공 할 때 왜 이렇게 많은 표를 얻습니까? (Meanshile는 정답은 johnpolacek의 @이고 1 투표가)
Yarin

5
경고!!!!!!!!!!!!!!! 이것은 정답이 아닙니다. johnpolacek이 정답을 가지고 있습니다. 그의 답변에 투표 해주세요.
mrbinky3000 2012

4
이러한 반대는 매우 특정한 상황을 제외하고는 더 이상 관련이없는 것으로 보입니다. Webkit은 이미지의 src를 이전과 똑같은 src로 변경할 때입니다. 방금 DOM에 추가 한 이미지의 경우 $ (...). load ()이면 충분합니다. 현재 FF 및 Chrome 및 IE6-9에서 테스트 됨 : jsfiddle.net/b9chris/tXVCe/2
Chris Moschini

1
+1 이미지가 브라우저 캐시에 없을 때 잘 작동합니다.
Lode apr

28

내 플러그인 waitForImages 를 사용 하여 이것을 처리 할 수 있습니다 .

$(document).waitForImages(function() {
   // Loaded.
});

이것의 장점은 하나의 조상 요소로 지역화 할 수 있고 선택적 으로 CSS에서 참조 된 이미지를 감지 할 수 있다는 것 입니다.

이것은 빙산의 일각에 불과합니다 . 더 많은 기능에 대해서는 문서 를 확인하십시오 .


안녕하세요 Alex, 유망 해 보입니다. 그러나 johnpolacek 및 hirisov가 제공 한 답변 및 의견에서 언급 한 것처럼 이미지가 이미 브라우저 캐시에있는 경우를 포함합니까?
SexyBeast

이미지를 생성하고 페이지가 이미로드 된 후 동적으로로드하는 프로세스가 있으며 사용자가 기다리는 동안 ajax 로더를 표시해야했습니다. 이 플러그인은 해당 사용 사례에 완벽하게 작동합니다. 하지만 img src 속성을 설정 한 후 함수를 호출해야합니다!
John Livermore 2011

20

IMG 이벤트 핸들러로 jQuery $ (). load () 사용이 보장되지 않습니다. 이미지가 캐시에서로드되면 일부 브라우저에서 이벤트를 시작하지 못할 수 있습니다. (이전?) Safari 버전의 경우 IMG 요소의 SRC 속성을 동일한 값 으로 변경하면 onload 이벤트가 발생하지 않습니다.

이것은 최신 jQuery (1.4.x) ( http://api.jquery.com/load-event )에서 인식되는 것으로 보입니다 .

이미지가 브라우저 캐시에서로드되는 경우로드 이벤트가 트리거되지 않을 수 있습니다. 이 가능성을 설명하기 위해 이미지가 준비되면 즉시 실행되는 특수로드 이벤트를 사용할 수 있습니다. event.special.load는 현재 플러그인으로 사용할 수 있습니다.

이제이 경우를 인식하는 플러그인과 IMG 요소로드 상태에 대한 IE의 "완료"속성이 있습니다. http://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js


16

이 답변 , 당신은 사용할 수있는 jQuery를로드 이벤트를window대신의 목적 document:

jQuery(window).load(function() {
    console.log("page finished loading now.");
});

페이지의 모든 콘텐츠가로드 된 후에 실행됩니다. 이것은 jQuery(document).load(...)DOM이로드를 마친 후에 트리거되는 것과 다릅니다 .


이것이 바로 제가 찾던 것입니다!
Eric K

4

crossbrowser 솔루션이 필요한 경우 imagesLoaded 플러그인을 사용할 수 있습니다.

 $("<img>", {src: 'image.jpg'}).imagesLoaded( function( $images, $proper, $broken ){
 if($broken.length > 0){
 //Error CallBack
 console.log('Error');
 }
 else{
 // Load CallBack
 console.log('Load');
 }
 });

IE 해결 방법이 필요한 경우

 var img = $("<img>", {
    error: function() {console.log('error'); },
    load: function() {console.log('load');}
    });
  img.attr('src','image.jpg');


2

동일 출처 이미지의 경우 다음을 사용할 수 있습니다.

$.get('http://www.your_domain.com/image.jpg', imgLoaded);

function imgLoaded(){
    console.log(this, 'loaded');
}


0
  function CheckImageLoadingState()
  {
     var counter = 0;
     var length = 0;

     jQuery('#siteContent img').each(function() 
     {
        if(jQuery(this).attr('src').match(/(gif|png|jpg|jpeg)$/))
          length++;
     });

     jQuery('#siteContent img').each(function() 
     {  
        if(jQuery(this).attr('src').match(/(gif|png|jpg|jpeg)$/))
        {
           jQuery(this).load(function() 
           {
           }).each(function() {
              if(this.complete) jQuery(this).load();
            });
        }
        jQuery(this).load(function()
        {
           counter++;
           if(counter === length) 
           {  
              //function to call when all the images have been loaded
              DisplaySiteContent();
           }
        });
     });
  }


0

나는 많은 플러그인이 상당히 부풀어 오르고 내가 원하는 방식으로 작동하기를 원했기 때문에 자체 스크립트를 만들었습니다. Mine은 각 이미지에 높이 (기본 이미지 높이)가 있는지 확인합니다. 캐싱 문제를 해결하기 위해 $ (window) .load () 함수와 결합했습니다.

나는 코드를 상당히 많이 주석 처리 했으므로 사용하지 않더라도 살펴 보는 것이 흥미로울 것입니다. 그것은 나를 위해 완벽하게 작동합니다.

더 이상 고민하지 않고 여기에 있습니다.

imgLoad.js 스크립트


0

모든 이미지가로드
되기를 기다리는 중 ... 여기에서 jfriend00 문제에 대한 anwser를 찾았습니다. jquery : 하나의 컨테이너 div의 이미지로드 이벤트를 수신하는 방법은 무엇입니까? .. 및 "if (this.complete)"
모든 것이로드되고 일부는 캐시에있을 수있을 때까지 기다리며! .. "오류"이벤트를 추가 했습니다. 모든 브라우저에서 강력합니다.

$(function() { // Wait dom ready
    var $img = $('img'), // images collection
        totalImg = $img.length,
        waitImgDone = function() {
            totalImg--;
            if (!totalImg) {
                console.log($img.length+" image(s) chargée(s) !");
            }
        };
    $img.each(function() {
        if (this.complete) waitImgDone(); // already here..
        else $(this).load(waitImgDone).error(waitImgDone); // completed...
    });
});

데모 : http://jsfiddle.net/molokoloco/NWjDb/


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