How to create a JavaScript callback for knowing when an image is loaded?

前端 未结 10 1103
太阳男子
太阳男子 2020-11-22 04:56

I want to know when an image has finished loading. Is there a way to do it with a callback?

If not, is there a way to do it at all?

相关标签:
10条回答
  • 2020-11-22 05:34

    .complete + callback

    This is a standards compliant method without extra dependencies, and waits no longer than necessary:

    var img = document.querySelector('img')
    
    function loaded() {
      alert('loaded')
    }
    
    if (img.complete) {
      loaded()
    } else {
      img.addEventListener('load', loaded)
      img.addEventListener('error', function() {
          alert('error')
      })
    }
    

    Source: http://www.html5rocks.com/en/tutorials/es6/promises/

    0 讨论(0)
  • 2020-11-22 05:38

    You can use the .complete property of the Javascript image class.

    I have an application where I store a number of Image objects in an array, that will be dynamically added to the screen, and as they're loading I write updates to another div on the page. Here's a code snippet:

    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);
    }
    
    0 讨论(0)
  • 2020-11-22 05:38

    Life is too short for 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="">

    0 讨论(0)
  • 2020-11-22 05:39

    You could use the load()-event in jQuery but it won't always fire if the image is loaded from the browser cache. This plugin https://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js can be used to remedy that problem.

    0 讨论(0)
  • 2020-11-22 05:40

    If the goal is to style the img after browser has rendered image, you should:

    const img = new Image();
    img.src = 'path/to/img.jpg';
    
    img.decode().then(() => {
    /* set styles */
    /* add img to DOM */ 
    });
    

    because the browser first loads the compressed version of image, then decodes it, finally paints it. since there is no event for paint you should run your logic after browser has decoded the img tag.

    0 讨论(0)
  • 2020-11-22 05:43

    these functions will solve the problem, you need to implement the DrawThumbnails function and have a global variable to store the images. I love to get this to work with a class object that has the ThumbnailImageArray as a member variable, but am struggling!

    called as in 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 } };
    }
    
    0 讨论(0)
提交回复
热议问题