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


113

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

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

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

답변:


153

이미지를 동적으로 생성 할 onload때 src.

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.