이미지로드가 완료된시기를 알고 싶습니다. 콜백으로 할 수있는 방법이 있습니까?
그렇지 않다면 전혀 할 수있는 방법이 있습니까?
이미지로드가 완료된시기를 알고 싶습니다. 콜백으로 할 수있는 방법이 있습니까?
그렇지 않다면 전혀 할 수있는 방법이 있습니까?
답변:
.complete
+ 콜백
이는 추가 종속성이없는 표준 호환 방법이며 더 이상 필요하지 않습니다.
var img = document.querySelector('img')
function loaded() {
alert('loaded')
}
if (img.complete) {
loaded()
} else {
img.addEventListener('load', loaded)
img.addEventListener('error', function() {
alert('error')
})
}
img.complete
통화와 통화 사이에 이미지가 완료되면 이것이 잘못 될 수 있습니까 addEventListener
?
load
이벤트 리스너가 있어야합니다 에있을 else
로서, 절 img.complete
전과 사실이 될 수있는 load
이벤트가 시작됩니다 그렇지 당신이 잠재적으로 수도 인 경우에 따라서, loaded
(이 상대적으로 가능성이 같은 변화에 있다는 것입니다주의 두 번 호출 img.complete
만이 진실을 때 이벤트 화재).
Image.onload () 가 종종 작동합니다.
이를 사용하려면 src 속성을 설정하기 전에 이벤트 핸들러를 바인드해야합니다.
관련된 링크들:
사용법 예 :
window.onload = function () {
var logo = document.getElementById('sologo');
logo.onload = function () {
alert ("The image has loaded!");
};
setTimeout(function(){
logo.src = 'https://edmullen.net/test/rc.jpg';
}, 5000);
};
<html>
<head>
<title>Image onload()</title>
</head>
<body>
<img src="#" alt="This image is going to load" id="sologo"/>
<script type="text/javascript">
</script>
</body>
</html>
load
이벤트가 유효하지 않다고 생각하는 것은 무엇입니까? html.spec.whatwg.org/multipage/webappapis.html#handler-onload 는 onload
이벤트 핸들러 의 정의입니다 .
Javascript 이미지 클래스의 .complete 속성을 사용할 수 있습니다.
배열에 여러 Image 객체를 저장하는 응용 프로그램이 있으며 화면에 동적으로 추가되며로드 할 때 페이지의 다른 div에 업데이트를 씁니다. 다음은 코드 스 니펫입니다.
var gAllImages = [];
function makeThumbDivs(thumbnailsBegin, thumbnailsEnd)
{
gAllImages = [];
for (var i = thumbnailsBegin; i < thumbnailsEnd; i++)
{
var theImage = new Image();
theImage.src = "thumbs/" + getFilename(globals.gAllPageGUIDs[i]);
gAllImages.push(theImage);
setTimeout('checkForAllImagesLoaded()', 5);
window.status="Creating thumbnail "+(i+1)+" of " + thumbnailsEnd;
// make a new div containing that image
makeASingleThumbDiv(globals.gAllPageGUIDs[i]);
}
}
function checkForAllImagesLoaded()
{
for (var i = 0; i < gAllImages.length; i++) {
if (!gAllImages[i].complete) {
var percentage = i * 100.0 / (gAllImages.length);
percentage = percentage.toFixed(0).toString() + ' %';
userMessagesController.setMessage("loading... " + percentage);
setTimeout('checkForAllImagesLoaded()', 20);
return;
}
}
userMessagesController.setMessage(globals.defaultTitle);
}
jQuery에서 load ()-event를 사용할 수는 있지만 이미지가 브라우저 캐시에서로드되는 경우 항상 발생하지는 않습니다. 이 플러그인 https://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js 를 사용하여 해당 문제를 해결할 수 있습니다.
jquery의 수명이 너무 짧습니다.
function waitForImageToLoad(imageElement){
return new Promise(resolve=>{imageElement.onload = resolve})
}
var myImage = document.getElementById('myImage');
var newImageSrc = "https://pmchollywoodlife.files.wordpress.com/2011/12/justin-bieber-bio-photo1.jpg?w=620"
myImage.src = newImageSrc;
waitForImageToLoad(myImage).then(()=>{
// Image have loaded.
console.log('Loaded lol')
});
<img id="myImage" src="">
src
JS 를 추가하여 혼란스럽게 보이게 합니다.
myImage.src = https://pmchollywoodlife.files.wordpress.com/2011/12/justin-bieber-bio-photo1.jpg?w=620
트릭을 수행합니다.
다음은 jQuery에 해당합니다.
var $img = $('img');
if ($img.length > 0 && !$img.get(0).complete) {
$img.on('load', triggerAction);
}
function triggerAction() {
alert('img has been loaded');
}
질문이 제기 된 2008에는 적합하지 않지만 요즘에는 이것이 나에게 효과적입니다.
async function newImageSrc(src) {
// Get a reference to the image in whatever way suits.
let image = document.getElementById('image-id');
// Update the source.
img.src = src;
// Wait for it to load.
await new Promise((resolve) => { image.onload = resolve; });
// Done!
console.log('image loaded! do something...');
}
이러한 함수는 문제를 해결하기 위해 함수를 구현 DrawThumbnails
하고 이미지를 저장하는 전역 변수가 있어야합니다. 나는 이것을 ThumbnailImageArray
멤버 변수로 가지고 있지만 어려움을 겪고 있는 클래스 객체와 함께 작동하도록하고 싶습니다.
로 호출 addThumbnailImages(10);
var ThumbnailImageArray = [];
function addThumbnailImages(MaxNumberOfImages)
{
var imgs = [];
for (var i=1; i<MaxNumberOfImages; i++)
{
imgs.push(i+".jpeg");
}
preloadimages(imgs).done(function (images){
var c=0;
for(var i=0; i<images.length; i++)
{
if(images[i].width >0)
{
if(c != i)
images[c] = images[i];
c++;
}
}
images.length = c;
DrawThumbnails();
});
}
function preloadimages(arr)
{
var loadedimages=0
var postaction=function(){}
var arr=(typeof arr!="object")? [arr] : arr
function imageloadpost()
{
loadedimages++;
if (loadedimages==arr.length)
{
postaction(ThumbnailImageArray); //call postaction and pass in newimages array as parameter
}
};
for (var i=0; i<arr.length; i++)
{
ThumbnailImageArray[i]=new Image();
ThumbnailImageArray[i].src=arr[i];
ThumbnailImageArray[i].onload=function(){ imageloadpost();};
ThumbnailImageArray[i].onerror=function(){ imageloadpost();};
}
//return blank object with done() method
//remember user defined callback functions to be called when images load
return { done:function(f){ postaction=f || postaction } };
}
addThumbnailImages
기능을 포함하여 관련이 없습니다 . 관련 코드로 줄이면 -1을 제거합니다.
브라우저에서 이미지를 렌더링 한 후 img의 스타일을 지정하는 것이 목표 인 경우 다음을 수행해야합니다.
const img = new Image();
img.src = 'path/to/img.jpg';
img.decode().then(() => {
/* set styles */
/* add img to DOM */
});
브라우저 첫번째 때문에 loads the compressed version of image
, 다음 decodes it
, 마지막으로 paints
그것. paint
브라우저 decoded
에 img 태그 가 있으면 로직을 실행해야하는 이벤트가 없기 때문입니다 .
React.js를 사용하는 경우 다음을 수행 할 수 있습니다.
render() {
// ...
<img
onLoad={() => this.onImgLoad({ item })}
onError={() => this.onImgLoad({ item })}
src={item.src} key={item.key}
ref={item.key} />
// ...}
어디: