Я хочу знать, когда изображение закончило загрузку. Есть ли способ сделать это с помощью обратного вызова?
Если нет, есть ли способ сделать это вообще?
Я хочу знать, когда изображение закончило загрузку. Есть ли способ сделать это с помощью обратного вызова?
Если нет, есть ли способ сделать это вообще?
Ответы:
.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')
})
}
Источник: http://www.html5rocks.com/en/tutorials/es6/promises/
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
обработчика событий.
Вы можете использовать свойство .complete класса изображений Javascript.
У меня есть приложение, в котором я храню несколько объектов 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);
}
Вы можете использовать событие load () - в jQuery, но оно не всегда срабатывает, если изображение загружается из кэша браузера. Этот плагин 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} />
// ...}
Куда: