एक छवि लोड होने पर जानने के लिए जावास्क्रिप्ट कॉलबैक कैसे बनाएं?


136

मैं जानना चाहता हूं कि एक छवि ने कब लोड किया है। क्या कॉलबैक के साथ ऐसा करने का कोई तरीका है?

यदि नहीं, तो क्या ऐसा करने का कोई तरीका है?


2
github.com/desandro/imagesloaded - Folks, इस पैकेज की जाँच करें।
मंगतीनंद

जवाबों:


159

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


4
अगर img.completeकॉल और कॉल के बीच छवि पूरी हो जाती है तो क्या यह गलत हो सकता है addEventListener?
थॉमस अहले

@ThomasAhle मैं एक विशेषज्ञ नहीं हूँ, लेकिन यह संभव लगता है। देखते हैं कि किसी के पास कोई हल है या नहीं।
सिरो सेंटिल्ली 郝海东 冠状 iro i ''

मुझे लगता है कि यह केवल समानांतर कोड के लिए एक मुद्दा होगा, जो कि ज्यादातर जावास्क्रिप्ट नहीं है ..
थॉमस अहले

4
@ThomasAhle यह नहीं हो सकता, क्योंकि ब्राउज़र केवल लोड ईवेंट को आग देगा जब ईवेंट कतार स्पून है। उस ने कहा, loadईवेंट श्रोता को एक elseखंड में होना चाहिए , क्योंकि ईवेंट के निकाल दिए जाने img.completeसे पहले यह सच हो सकता loadहै, इसलिए यदि ऐसा नहीं होता तो आप संभावित loadedरूप से दो बार कॉल कर सकते थे (ध्यान दें कि यह अपेक्षाकृत रूप से बदलने की संभावना है कि img.completeकेवल ईवेंट के सत्य होने पर ही आग)।
gsnedders

72

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>


26
FYI करें: W3C कल्पना के अनुसार, IMG तत्वों के लिए Onload एक वैध घटना नहीं है। जाहिर है कि ब्राउज़र इसका समर्थन करते हैं, लेकिन अगर आप कल्पना के बारे में परवाह करते हैं और 100% सुनिश्चित नहीं हैं कि आप जिन सभी ब्राउज़रों का समर्थन करना चाहते हैं, तो आप इसे फिर से जोड़ना चाहते हैं या कम से कम इसे ध्यान में रख सकते हैं।
जेसन बंटिंग

3
स्रोत को सेट करने के लिए 5 सेकंड इंतजार करना एक बुरा विचार क्यों लगता है?
quemeful

8
@quemeful यही कारण है कि इसे "एक उदाहरण" कहा जाता है।
डिएगो जैन्सिक

3
@JasonBunting क्या आप देख रहे हैं कि आपको लगता है कि loadघटना वैध नहीं है? html.spec.whatwg.org/multipage/webappapis.html#handler-onloadonload ईवेंट हैंडलर की परिभाषा है ।
gsnedders

4
@gsnedders - आपको लगता है, मैं मान लूंगा, कि जब मैंने वह टिप्पणी लिखी थी, तो मैं उस मानक का जिक्र कर रहा था, जिस पर आपने ध्यान नहीं दिया था, जो 4.5 साल का है। क्या आपने फिर से पूछा होगा, मैं इसे इंगित कर सकता था, शायद। वेब की प्रकृति ऐसी है, है ना? चीजें पुरानी हो जाती हैं या स्थानांतरित हो जाती हैं या संशोधित होती हैं, आदि
जेसन बंटिंग

20

आप जावास्क्रिप्ट छवि वर्ग की .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);
}

मैंने पहले भी अपने काम में इसी तरह के कोड का उपयोग किया है। यह सभी ब्राउज़रों में अच्छा काम करता है।
गेब्रियल हर्ले

2
पूर्ण जाँच के साथ समस्या यह है कि IE9 के साथ शुरू होने वाली OnLoad ईवेंट को सभी छवियों के लोड होने से पहले निकाल दिया जाता है और इसकी जाँच फ़ंक्शन के लिए ट्रिगर खोजने में मुश्किल होती है।
जीन विंसेंट

11

आप jQuery में लोड () - ईवेंट का उपयोग कर सकते हैं लेकिन ब्राउज़र कैश से छवि लोड होने पर यह हमेशा फायर नहीं करेगा। इस प्लगइन https://github.com/peol/jquery.imgloaded/raw/master/ahpi.imgload.js का उपयोग उस समस्या को दूर करने के लिए किया जा सकता है।


8

जीवन बहुत कम है 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="">


1
यह एक शानदार जवाब है, लेकिन मुझे नहीं लगता कि आपको इतना कोड भी चाहिए। आप इसे केवल srcJS के साथ जोड़कर भ्रमित कर रहे हैं ।
ब्रैंडन बेनिफिट

1
प्रोग्रामिंग में समय एक बहुत बड़ी बाधा है। मेरे विस्तार से, पठनीय (कुछ समय तक) कोड लिखने से बहुत बड़ा समय मिलता है।
इदं बीकर

आप अगली पंक्ति में उपभोग करने के लिए केवल एक नए चर में src को क्यों संग्रहीत करेंगे? अगर संक्षिप्तता आपका लक्ष्य है, तो यह एक विरोधी पैटर्न है। myImage.src = https://pmchollywoodlife.files.wordpress.com/2011/12/justin-bieber-bio-photo1.jpg?w=620उसने चाल चली।
योशिय्याह


1

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...');
}

0

ये फ़ंक्शन समस्या को हल करेंगे, आपको 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 } };
}

11
इस कोड में से अधिकांश अप्रासंगिक है, जिसमें आपका पूरा addThumbnailImagesकार्य शामिल है। इसे संबंधित कोड में डाल दें और मैं -1 को हटा दूंगा।
जस्टिन मॉर्गन

0

यदि ब्राउज़र की छवि प्रदान करने के बाद लक्ष्य को स्टाइल करना है, तो आपको चाहिए:

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आपके पास कोई ऐसी घटना नहीं है जिसके लिए आपको अपने तर्क को चलाना चाहिए क्योंकि ब्राउज़र में decodedimg टैग है।


-2

यदि आप React.js का उपयोग कर रहे हैं, तो आप ऐसा कर सकते हैं:

render() {

// ...

<img 
onLoad={() => this.onImgLoad({ item })}
onError={() => this.onImgLoad({ item })}

src={item.src} key={item.key}
ref={item.key} />

// ...}

कहाँ पे:

  • - onLoad (...) अब कुछ इस तरह से बुलाया जाएगा: {src: " https: //......png ", कुंजी: "1"} आप यह जानने के लिए "कुंजी" का उपयोग कर सकते हैं कि कौन से चित्र सही ढंग से लोड किया गया है और जो नहीं है।
  • - onError (...) यह वही है लेकिन त्रुटियों के लिए है।
  • - ऑब्जेक्ट "आइटम" कुछ इस तरह है {कुंजी: "..", src: ".."} आप छवियों की सूची में उपयोग करने के लिए छवियों के URL और कुंजी को संग्रहीत करने के लिए उपयोग कर सकते हैं।

  • हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
    Licensed under cc by-sa 3.0 with attribution required.