Quiero saber cuándo una imagen ha terminado de cargarse. ¿Hay alguna manera de hacerlo con una devolución de llamada?
Si no, ¿hay alguna manera de hacerlo?
Quiero saber cuándo una imagen ha terminado de cargarse. ¿Hay alguna manera de hacerlo con una devolución de llamada?
Si no, ¿hay alguna manera de hacerlo?
Respuestas:
.complete
+ devolución de llamada
Este es un método compatible con los estándares sin dependencias adicionales, y no espera más de lo necesario:
var img = document.querySelector('img')
function loaded() {
alert('loaded')
}
if (img.complete) {
loaded()
} else {
img.addEventListener('load', loaded)
img.addEventListener('error', function() {
alert('error')
})
}
Fuente: http://www.html5rocks.com/en/tutorials/es6/promises/
img.complete
llamada y la addEventListener
llamada?
load
oyente del evento debe estar en una else
cláusula, ya que img.complete
puede hacerse realidad antes de load
que se active el evento, por lo tanto, si no fuera así, podría haber loaded
llamado dos veces (tenga en cuenta que es probable que esto cambie de manera tal que img.complete
solo se convierta en realidad cuando el evento incendios).
Image.onload () a menudo funcionará.
Para usarlo, deberá asegurarse de vincular el controlador de eventos antes de establecer el atributo src.
Enlaces relacionados:
Ejemplo de uso:
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
evento no es válido? html.spec.whatwg.org/multipage/webappapis.html#handler-onload es la definición del onload
controlador de eventos.
Puede usar la propiedad .complete de la clase de imagen Javascript.
Tengo una aplicación donde almaceno varios objetos de imagen en una matriz, que se agregarán dinámicamente a la pantalla, y a medida que se cargan, escribo actualizaciones en otro div en la página. Aquí hay un fragmento de código:
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);
}
Puede usar el evento load () en jQuery, pero no siempre se activará si la imagen se carga desde la memoria caché del navegador. Este complemento https://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js se puede utilizar para solucionar ese problema.
La vida es demasiado corta para 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
con JS.
myImage.src = https://pmchollywoodlife.files.wordpress.com/2011/12/justin-bieber-bio-photo1.jpg?w=620
Hace el truco.
Aquí está el equivalente de jQuery:
var $img = $('img');
if ($img.length > 0 && !$img.get(0).complete) {
$img.on('load', triggerAction);
}
function triggerAction() {
alert('img has been loaded');
}
No es adecuado para 2008 cuando se hizo la pregunta, pero en estos días esto funciona bien para mí:
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...');
}
Estas funciones resolverán el problema, debe implementar la DrawThumbnails
función y tener una variable global para almacenar las imágenes. Me encanta hacer que esto funcione con un objeto de clase que tiene elThumbnailImageArray
variable como miembro, ¡pero estoy luchando!
llamado como en 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
función. Reducirlo al código relevante y eliminaré el -1.
Si el objetivo es diseñar el img después de que el navegador haya procesado la imagen, debe:
const img = new Image();
img.src = 'path/to/img.jpg';
img.decode().then(() => {
/* set styles */
/* add img to DOM */
});
porque el navegador primero loads the compressed version of image
, luego decodes it
, finalmente paints
. ya que no hay ningún evento para paint
usted, debe ejecutar su lógica después de que el navegador tenga decoded
la etiqueta img.
Si está utilizando React.js, puede hacer esto:
render() {
// ...
<img
onLoad={() => this.onImgLoad({ item })}
onError={() => this.onImgLoad({ item })}
src={item.src} key={item.key}
ref={item.key} />
// ...}
Dónde: