image.onload 이벤트 및 브라우저 캐시


113

이미지가로드 된 후 경고 상자를 만들고 싶지만 이미지가 브라우저 캐시에 저장되면 .onload이벤트가 발생하지 않습니다.

이미지가 캐시되었는지 여부에 관계없이 이미지가로드되었을 때 경고를 트리거하려면 어떻게해야합니까?

var img = new Image();
img.src = "img.jpg";
img.onload = function () {
   alert("image is loaded");
}

답변:


153

이미지를 동적으로 생성 할 onloadsrc.

var img = new Image();
img.onload = function () {
   alert("image is loaded");
}
img.src = "img.jpg";

Fiddle- 최신 Firefox 및 Chrome 릴리스에서 테스트되었습니다.

동적으로 생성 된 단일 이미지에 적용한 이 게시물 의 답변을 사용할 수도 있습니다 .

var img = new Image();
// 'load' event
$(img).on('load', function() {
  alert("image is loaded");
});
img.src = "img.jpg";

깡깡이


기다림. 두 번째 코드 예제가 .src.onload를 설정 하기 전에 잘못된 작업을 수행하고 설정하는 이유는 무엇 입니까? 첫 번째 코드 예제에서 옳았지만 두 번째 코드는 엉망이었습니다. 두 번째는 일부 버전의 IE에서 제대로 작동하지 않습니다.
jfriend00

1
@ jfriend00 아니, 엉망이 아닙니다. 백업 코드 (두 번째 코드)는 첫 번째 코드가 작동을 멈춘 경우를 대비 한 것입니다. 이미지가 이미 캐시 된 경우 검사를 =]사용 .complete하므로 코드에서이를 보여줍니다. 물론 모범 사례를 위해 항상 src모든 핸들러 바인딩을 설정할 수 있습니다 .
Fabrício Matté 2012 년

4
.complete이 경우 의지 할 이유가 없습니다 . 설정하기 전에 먼저로드 핸들러를 설정하기 만하면됩니다 .src. 상상할 수있는 모든 브라우저에서 수천 개의 사이트에서 사용하는 슬라이드 쇼를 작성했으며 첫 번째 기술은 매번 작동합니다. .complete이와 같이 처음부터 새 이미지를 만들 때 확인할 필요가 없습니다 .
jfriend00 2012-09-10

=]좋습니다. 미리 알려 주셔서 감사합니다 . 귀하의 추론을 반영하여 답변을 업데이트했습니다 . 또한 @ jfriend00 이미지가 IE에서로드되는지 확인할 수 있습니까? 내 네트워크 또는 IE 및 이미지에 문제가 있는지 궁금합니다.
Fabrício Matté 2012 년

9
또한 오늘 나는 img.src = ''이전에 사용 된 경우 새로운 src를 할당하기 전에 웹킷이 필요하다는 것을 발견했습니다 .
quux

10

src가 이미 설정되어 있으면 이벤트 핸들러가 바인딩되기 전에 캐시 된 케이스에서 이벤트가 발생합니다. 따라서 이벤트도 기반으로 트리거해야합니다 .complete.

코드 샘플 :

$("img").one("load", function() {
   //do stuff
}).each(function() {
   if(this.complete || /*for IE 10-*/ $(this).height() > 0)
     $(this).load();
});

6

이러한 종류의 상황에 대해 두 가지 가능한 솔루션이 있습니다.

  1. 이 게시물에 제안 된 솔루션 사용
  2. 다음 src과 같이 브라우저가 다시 다운로드하도록 이미지 에 고유 한 접미사를 추가합니다 .

    var img = new Image();
    img.src = "img.jpg?_="+(new Date().getTime());
    img.onload = function () {
        alert("image is loaded");
    }

이 코드에서는 이미지 URL 끝에 현재 타임 스탬프를 추가 할 때마다 고유하게 만들고 브라우저에서 이미지를 다시 다운로드합니다.


44
이 모든 것은 캐싱을 물리 치는 것입니다. 이 문제를 해결하는 것은 잘못된 방법입니다. 올바른 방법은 Fabricio의 답변입니다. 값을 .onload설정하기 전에 핸들러를 설정하기 만하면 .src일부 버전의 IE에서 onload 이벤트를 놓치지 않습니다.
jfriend00

1
예, 맞습니다.하지만 항상 캐시하는 것이 바람직하지는 않으며 때로는 이미지를 캐시하지 않아야합니다. 이 특정 상황에서 물론 그것은 필요에 따라 달라집니다
haynar

1
내 각도 앱에서 다른 답변이 말하는 모든 것을 시도했지만 도움이되지 않았습니다. 그러나이 답변과 같이 캐시하지 않도록 강제하면 저에게 효과적이었습니다. 그래서 플러스 하나.
Thanu

최신 버전의 Chrome에서 나를 위해 일한 유일한 솔루션입니다.
Young Bob

3

오늘도 같은 문제를 만났습니다. 다양한 방법을 시도 후, 난 그냥 내 크기의 코드를 넣어 실현 $(window).load(function() {})대신에 document.ready(페이지를 ajaxing하지 않는 경우) 문제의 일부를 해결할 것입니다.


이것은 또한 브라우저에 이미지가 캐시되고 창로드와 함께
정상적으로

정확히 내가 직면 한 문제. 내 문제 $(document).ready$(window).load해결 하기 위해 변경 했습니다 .
Tariqul Islam

0

Chrome에서이 작업을 수행 할 수 있음을 발견했습니다.

  $('.onload-fadein').each(function (k, v) {
    v.onload = function () {
        $(this).animate({opacity: 1}, 2000);
    };
    v.src = v.src;
});

.src를 자체로 설정하면 onload 이벤트가 트리거됩니다.

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