나하고 싶어:
$("img").bind('load', function() {
// do stuff
});
그러나 이미지가 캐시에서로드 될 때로드 이벤트가 발생하지 않습니다. jQuery 문서 는 이 문제를 해결하기 위해 플러그인 을 제안 하지만 작동하지 않습니다.
나하고 싶어:
$("img").bind('load', function() {
// do stuff
});
그러나 이미지가 캐시에서로드 될 때로드 이벤트가 발생하지 않습니다. jQuery 문서 는 이 문제를 해결하기 위해 플러그인 을 제안 하지만 작동하지 않습니다.
답변:
src
이 이미 설정되어 있으면 이벤트 처리기가 바인딩되기 전에 캐시 된 사례에서 이벤트가 시작됩니다. 이 문제를 해결하려면 다음과 같이 이벤트 기반 점검 및 트리거를 반복 .complete
하십시오.
$("img").one("load", function() {
// do stuff
}).each(function() {
if(this.complete) {
$(this).load(); // For jQuery < 3.0
// $(this).trigger('load'); // For jQuery >= 3.0
}
});
setTimeout(function(){//do stuff},0)
'load'함수 내에를 추가하고 싶습니다 . 0 은 브라우저 시스템 (DOM)에 모든 추가 정보가 올바르게 업데이트되도록 추가로 한 번의 틱을 제공합니다.
.load()
는 이벤트를 트리거하지 않고 필요한 인수가 1 개 .trigger("load")
DOM이 아닌 이미지 객체로 다시로드 할 것을 제안 할 수 있습니까? 캐시 된 경우 시간이 전혀 걸리지 않으며 온로드는 계속 실행됩니다. 캐시되지 않은 경우 이미지가로드 될 때 온로드를 발생 시키며, 이는 이미지의 DOM 버전이로드를 완료하는 시간과 같아야합니다.
자바 스크립트 :
$(document).ready(function() {
var tmpImg = new Image() ;
tmpImg.src = $('#img').attr('src') ;
tmpImg.onload = function() {
// Run onload code.
} ;
}) ;
업데이트 됨 (여러 이미지를 처리하고 올바르게 정렬 된 온로드 첨부 파일로) :
$(document).ready(function() {
var imageLoaded = function() {
// Run onload code.
}
$('#img').each(function() {
var tmpImg = new Image() ;
tmpImg.onload = imageLoaded ;
tmpImg.src = $(this).attr('src') ;
}) ;
}) ;
load
처리기 를 추가 하기 전에 처리기 를 연결해야합니다 . 또한 작동하지 않지만 하나의 이미지에서는 OPs 코드가 많은 경우 작동합니다.
#img
는 요소 선택기가 아닌 ID입니다. :) 또한 this.src
작동합니다. 필요하지 않은 곳에서는 jQuery를 사용할 필요가 없습니다.
imageLoaded
하려면tmp.onload = imageLoaded.bind(this)
내 간단한 솔루션, 외부 플러그인이 필요하지 않으며 일반적인 경우 충분합니다.
/**
* Trigger a callback when the selected images are loaded:
* @param {String} selector
* @param {Function} callback
*/
var onImgLoad = function(selector, callback){
$(selector).each(function(){
if (this.complete || /*for IE 10-*/ $(this).height() > 0) {
callback.apply(this);
}
else {
$(this).on('load', function(){
callback.apply(this);
});
}
});
};
다음과 같이 사용하십시오.
onImgLoad('img', function(){
// do stuff
});
예를 들어,로드시 이미지를 페이드하려면 다음을 수행하십시오.
$('img').hide();
onImgLoad('img', function(){
$(this).fadeIn(700);
});
또는 jquery 플러그인과 같은 접근 방식을 선호하는 경우 :
/**
* Trigger a callback when 'this' image is loaded:
* @param {Function} callback
*/
(function($){
$.fn.imgLoad = function(callback) {
return this.each(function() {
if (callback) {
if (this.complete || /*for IE 10-*/ $(this).height() > 0) {
callback.apply(this);
}
else {
$(this).on('load', function(){
callback.apply(this);
});
}
}
});
};
})(jQuery);
그리고 이런 식으로 사용하십시오 :
$('img').imgLoad(function(){
// do stuff
});
예를 들면 다음과 같습니다.
$('img').hide().imgLoad(function(){
$(this).fadeIn(700);
});
width
, max-height
leave height:auto
, 이미지를 늘려야하는 경우에만 너비와 높이를 모두 설정해야하는 경우가 종종 있습니다. 보다 강력한 솔루션을 위해 ImagesLoaded
실제로 jQuery와 함께해야합니까? onload
이벤트를 이미지에 직접 첨부 할 수도 있습니다.
<img src="/path/to/image.jpg" onload="doStuff(this);" />
캐시에서 이미지가로드 될 때마다 실행됩니다.
onload
이미지가 캐시에서 두 번째로로드 될 때 핸들러가 실행됩니까?
로드 오류를 지원하여이 코드를 사용할 수도 있습니다.
$("img").on('load', function() {
// do stuff on success
})
.on('error', function() {
// do stuff on smth wrong (error 404, etc.)
})
.each(function() {
if(this.complete) {
$(this).load();
} else if(this.error) {
$(this).error();
}
});
load
핸들러를 먼저 설정 한 다음 나중에 each
함수 에서 호출하는 것입니다.
방금이 문제가 있었고 캐시를 죽이거나 플러그인을 다운로드하지 않는 솔루션을 어디서나 검색했습니다.
나는이 스레드를 즉시 보지 못했기 때문에 대신 재미있는 수정이며 여기에 게시 할 가치가있는 다른 것을 발견했습니다.
$('.image').load(function(){
// stuff
}).attr('src', 'new_src');
나는 실제로 여기에 의견 에서이 아이디어를 얻었다 : http://www.witheringtree.com/2009/05/image-load-event-binding-with-ie-using-jquery/
나는 그것이 왜 작동하는지 모르겠지만 IE7에서 이것을 테스트했으며 그것이 작동하기 전에 어디에서 깨졌습니까?
도움이 되길 바랍니다.
허용 된 답변은 실제로 다음과 같은 이유를 설명합니다.
src가 이미 설정되어 있으면 이벤트 핸들러를 바인드하기 전에 이벤트가 캐시에서 발생합니다.
$image.load(function(){ something(); }).attr('src', $image.attr('src'));
원래 소스를 재설정하는 데 사용 했습니다.
jQuery를 사용하여 이미지의 src로 새 이미지를 생성하고 그에 직접로드 메소드를 지정하면 jQuery가 새 이미지 생성을 마치면로드 메소드가 성공적으로 호출됩니다. 이것은 IE 8, 9 및 10에서 나를 위해 일하고 있습니다.
$('<img />', {
"src": $("#img").attr("src")
}).load(function(){
// Do something
});
내가 찾은 해결책 https://bugs.chromium.org/p/chromium/issues/detail?id=7731#c12 (이 코드는 주석에서 직접 가져 왔습니다)
var photo = document.getElementById('image_id');
var img = new Image();
img.addEventListener('load', myFunction, false);
img.src = 'http://newimgsource.jpg';
photo.src = img.src;
GUS의 예에 대한 수정 :
$(document).ready(function() {
var tmpImg = new Image() ;
tmpImg.onload = function() {
// Run onload code.
} ;
tmpImg.src = $('#img').attr('src');
})
온로드 전후에 소스를 설정하십시오.
src
연결하기 전에 를 설정하지 않아도 onload
나중에는 충분합니다.
당신이 이것을 원한다면 나는 당신에게 작은 팁을 줄 수 있습니다 :
<div style="position:relative;width:100px;height:100px">
<img src="loading.jpg" style='position:absolute;width:100px;height:100px;z-index:0'/>
<img onLoad="$(this).fadeIn('normal').siblings('img').fadeOut('normal')" src="picture.jpg" style="display:none;position:absolute;width:100px;height:100px;z-index:1"/>
</div>
브라우저가 사진을 캐시 할 때 그렇게하면 항상 img가 표시되지만 실제 그림 아래에 img를로드하는 데 아무런 문제가 없습니다.
순수한 CSS 솔루션을 원한다면이 트릭이 잘 작동합니다. 변환 객체를 사용하십시오. 이미지가 캐시되거나 캐시되지 않은 경우에도 작동합니다.
CSS :
.main_container{
position: relative;
width: 500px;
height: 300px;
background-color: #cccccc;
}
.center_horizontally{
position: absolute;
width: 100px;
height: 100px;
background-color: green;
left: 50%;
top: 0;
transform: translate(-50%,0);
}
.center_vertically{
position: absolute;
top: 50%;
left: 0;
width: 100px;
height: 100px;
background-color: blue;
transform: translate(0,-50%);
}
.center{
position: absolute;
top: 50%;
left: 50%;
width: 100px;
height: 100px;
background-color: red;
transform: translate(-50%,-50%);
}
HTML :
<div class="main_container">
<div class="center_horizontally"></div>
<div class="center_vertically"></div>
<div class="center"></div>
</div>
</div