[javascript] Javascript / jQuery를 사용하여 이미지가로드되었는지 어떻게 확인할 수 있습니까?
사용자의 브라우저 창에 맞게 큰 이미지의 크기를 조정하기 위해 Javascript를 작성하고 있습니다. (불행히도 소스 이미지의 크기를 제어하지 않습니다.)
따라서 다음과 같은 내용이 HTML에 있습니다.
<img id="photo"
src="a_really_big_file.jpg"
alt="this is some alt text"
title="this is some title text" />
src
이미지 가 있는지 확인할 수있는 방법이 있습니까?img
태그 가 다운로드 이 있습니까?
$(document).ready()
브라우저가 이미지를로드하기 전에가 실행 되면 문제 가 발생하기 때문에 이것이 필요합니다 . $("#photo").width()
그리고 $("#photo").height()
자리 표시 자 (대체 텍스트)의 크기를 반환합니다. 제 경우에는 134 x 20과 같습니다.
지금은 사진의 높이가 150 미만인지 확인하고있는 경우 대체 텍스트라고 가정합니다. 그러나 이것은 꽤 해킹이며 사진의 높이가 150 픽셀 미만이거나 (내 특정 경우에는 가능성이 낮음) 대체 텍스트의 높이가 150 픽셀 이상인 경우 (작은 브라우저 창에서 발생할 수 있음) 중단됩니다. .
편집 : 코드를보고 싶은 사람 :
$(function()
{
var REAL_WIDTH = $("#photo").width();
var REAL_HEIGHT = $("#photo").height();
$(window).resize(adjust_photo_size);
adjust_photo_size();
function adjust_photo_size()
{
if(REAL_HEIGHT < 150)
{
REAL_WIDTH = $("#photo").width();
REAL_HEIGHT = $("#photo").height();
if(REAL_HEIGHT < 150)
{
//image not loaded.. try again in a quarter-second
setTimeout(adjust_photo_size, 250);
return;
}
}
var new_width = . . . ;
var new_height = . . . ;
$("#photo").width(Math.round(new_width));
$("#photo").height(Math.round(new_height));
}
});
업데이트 : 제안 해 주셔서 감사합니다. 이벤트에 대한 콜백을 설정하면 이벤트가 발생하지 않을 위험이 $("#photo").load
있으므로 이미지 태그에 직접 onLoad 이벤트를 정의했습니다. 기록을 위해 다음은 내가 사용한 코드입니다.
<img id="photo"
onload="photoLoaded();"
src="a_really_big_file.jpg"
alt="this is some alt text"
title="this is some title text" />
그런 다음 Javascript에서 :
//This must be outside $() because it may get called first
var isPhotoLoaded = false;
function photoLoaded()
{
isPhotoLoaded = true;
}
$(function()
{
//Hides scrollbars, so we can resize properly. Set with JS instead of
// CSS so that page doesn't break with JS disabled.
$("body").css("overflow", "hidden");
var REAL_WIDTH = -1;
var REAL_HEIGHT = -1;
$(window).resize(adjust_photo_size);
adjust_photo_size();
function adjust_photo_size()
{
if(!isPhotoLoaded)
{
//image not loaded.. try again in a quarter-second
setTimeout(adjust_photo_size, 250);
return;
}
else if(REAL_WIDTH < 0)
{
//first time in this function since photo loaded
REAL_WIDTH = $("#photo").width();
REAL_HEIGHT = $("#photo").height();
}
var new_width = . . . ;
var new_height = . . . ;
$("#photo").width(Math.round(new_width));
$("#photo").height(Math.round(new_height));
}
});
답변
이벤트 리스너를 추가하거나 이미지가 onload를 통해 자체적으로 알리도록합니다. 그런 다음 거기에서 치수를 파악하십시오.
<img id="photo"
onload='loaded(this.id)'
src="a_really_big_file.jpg"
alt="this is some alt text"
title="this is some title text" />
답변
은 Using 데이터가 저장 JQuery와 당신은 ‘로드’상태를 정의 할 수 있습니다.
<img id="myimage" onload="$(this).data('loaded', 'loaded');" src="lolcats.jpg" />
그런 다음 다른 곳에서 할 수 있습니다.
if ($('#myimage').data('loaded')) {
// loaded, so do stuff
}
답변
정답은 event.special.load 를 사용하는 것입니다.
이미지가 브라우저 캐시에서로드되는 경우로드 이벤트가 트리거되지 않을 수 있습니다. 이러한 가능성을 설명하기 위해 이미지가 준비되면 즉시 실행되는 특수로드 이벤트를 사용할 수 있습니다. event.special.load는 현재 플러그인으로 사용할 수 있습니다.
답변
Allain이 말한대로하고 싶지만 가끔 이미지가 dom 준비 전에로드되므로로드 핸들러가 실행되지 않습니다. 가장 좋은 방법은 Allain이 말한대로 수행하는 것이지만로드 핸들러를 부착 한 후 javascript로 이미지의 src를 설정합니다. 이렇게하면 발사를 보장 할 수 있습니다.
접근성 측면에서 자바 스크립트가없는 사용자도 사이트를 사용할 수 있습니까? img 태그에 올바른 src를 지정하고 js를 실행하기 위해 dom ready handler를 첨부 할 수 있습니다. 이미지 src를 지우고 (페이지 깜박임을 방지하기 위해 css로 고정 된 높이와 높이를 제공) img로드 핸들러를 설정합니다. 그런 다음 src를 올바른 파일로 재설정하십시오. 이렇게하면 모든 기지를 다룰 수 있습니다. 🙂
답변
원래 질문에 대한 최근 댓글 중 하나에 따라
$(function() {
$(window).resize(adjust_photo_size);
adjust_photo_size();
function adjust_photo_size() {
if (!$("#photo").get(0).complete) {
$("#photo").load(function() {
adjust_photo_size();
});
} else {
...
}
});
경고 img.complete 항상 제대로 브라우저에 의해 설정되어 있기 때문에이 답변하는 것은, IE8에 심각한 루프가 발생할 낮출 수 있습니다. ie8을 지원해야하는 경우 플래그를 사용하여 이미지가로드되었음을 기억하십시오.
답변
다음과 같이 시도하십시오.
$("#photo").load(function() {
alert("Hello from Image");
});
답변
요소의 이미지가로드되었는지 확인하는 브라우저 간 호환 방법을 제공하는 “imagesLoaded”라는 jQuery 플러그인이 있습니다.
대지: https://github.com/desandro/imagesloaded/
내부에 많은 이미지가있는 컨테이너의 사용법 :
$('container').imagesLoaded(function(){
console.log("I loaded!");
})
플러그인은 훌륭합니다.
- 내부에 많은 이미지가있는 컨테이너를 확인하는 작업
- 이미지가로드되었는지 확인하기 위해 작동합니다.