代码之家  ›  专栏  ›  技术社区  ›  Matt

如何创建JavaScript回调来知道何时加载图像?

  •  104
  • Matt  · 技术社区  · 16 年前

    我想知道图像何时完成加载。有办法回拨吗?

    如果没有,有办法吗?

    8 回复  |  直到 7 年前
        1
  •  140
  •   Ciro Santilli OurBigBook.com    6 年前

    .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/

        2
  •  67
  •   dota2pro Matej    5 年前

    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>
        3
  •  20
  •   Jon DellOro    16 年前

    您可以使用Javascript图像类的.complete属性。

    我有一个应用程序,其中我在一个数组中存储了许多图像对象,这些对象将动态添加到屏幕上,当它们加载时,我将更新写到页面上的另一个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);
    }
    
        4
  •  11
  •   jimmystormig    14 年前

    您可以在jQuery中使用load()-event,但如果从浏览器缓存加载图像,则它不会始终触发。这个插件 https://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js 可以用来解决那个问题。

        5
  •  8
  •   izzulmakin    6 年前

    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="">
        6
  •  2
  •   Alexander Drobyshevsky    8 年前

    这里是jQuery的等价物:

    var $img = $('img');
    
    if ($img.length > 0 && !$img.get(0).complete) {
       $img.on('load', triggerAction);
    }
    
    function triggerAction() {
       alert('img has been loaded');
    }
    
        7
  •  0
  •   Eonasdan Alex Mckay    12 年前

    这些函数将解决问题,您需要实现 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 } };
    }
    
        8
  •  -2
  •   Mike    7 年前

    render() {
    

    // ...

    <img 
    onLoad={() => this.onImgLoad({ item })}
    onError={() => this.onImgLoad({ item })}
    
    src={item.src} key={item.key}
    ref={item.key} />
    

    }

    哪里:

  • {来源:“ https://......png ,键:“1”}
  • -onError(…)相同但有错误。
  • 您可以使用存储图像的URL和密钥,以便在图像列表中使用。