7

मैं प्रतीक्षा करने के लिए और फिर एक संदेश जब एक सरणी में सभी छवियों पूरा कर लिया है लोड हो रहा है (.complete का प्रयोग करके) मिल कोशिश कर रहा हूँ, इस सवाल का जवाब here प्रति। जैसे मैंने नीचे की तरह एक अनंत लूप स्थापित किया। हालांकि, जब मैं इसे चलाता हूं तो मुझे एक त्रुटि मिलती है जो चेकफोर इमेज लोडेड() परिभाषित नहीं है। यह कोड एक बुकमार्कलेट के माध्यम से चलाया जा रहा है, और इस तरह यह सब एक अज्ञात फ़ंक्शन निर्माण (नीचे के रूप में) में लपेटा गया है। यदि मैं उस कार्य के बाहर अपने फ़ंक्शन और चर को दोबारा परिभाषित करता हूं, तो यह काम करता है। लेकिन यह एक बुकमार्कलेट लिखने का एक खराब तरीका प्रतीत होता है। मैं इसे कैसे ठीक कर सकता हूं ताकि यह सेटटाइमआउट के बाद भी फ़ंक्शन को पहचान सके?समारोह में ही बुला काम नहीं कर रहा (अनंत लूप, जावास्क्रिप्ट)

(function() { 

    //var images = array of images that have started loading 

    function checkForAllImagesLoaded(){ 
     for (var i = 0; i < images.length; i++) { 
      if (!images[i].complete) { 
       setTimeout('checkForAllImagesLoaded()', 20); 
       return; 
      } 
     } 
    } 

    checkForAllImagesLoaded(); 

})(); 

उत्तर

7

समारोह कॉल निकालें, और उद्धरण बाहर ले। यदि आप उद्धरण नहीं डालते हैं, तो setTimeout उस फ़ंक्शन का सीधा संदर्भ प्राप्त करता है जिसे बाद में लागू किया जा सकता है। हालांकि, अगर एक स्ट्रिंग के अंदर इस तरह के "checkForAllImagesLoaded" या "checkForAllImagesLoaded()" के रूप में, तो यह कोड निष्पादित करेंगे पारित कर दिया-में जब समय समाप्त होता है।

उस समय, checkForAllImagesLoaded वैश्विक वस्तु (विंडो) में खोजा जाएगा, लेकिन यह परिभाषित नहीं किया गया है, क्योंकि आपको undefined त्रुटि क्यों मिल रही है।

आपका कोड एक स्वयं बुला गुमनाम समारोह में लपेटा जाता है, और यह के बाहर checkForAllImagesLoaded मौजूद नहीं है। तो एक स्ट्रिंग के बजाय, अपने सेटटाइमआउट कॉल में फ़ंक्शन का सीधा संदर्भ पास करें।

setTimeout(checkForAllImagesLoaded, 20); 

setTimeout या तो एक समारोह (और वैकल्पिक तर्क), या जावास्क्रिप्ट कोड के साथ एक तार के साथ कहा जा सकता है:

var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]); 
var timeoutID = window.setTimeout(code, delay); 
+0

सुंदर, धन्यवाद! –

1

सेटटाइम कॉल में() को हटाएं।

setTimeout('checkForAllImagesLoaded', 20);

+0

काम नहीं करेगा यही कारण है, के बाद से ब्राउज़र 'eval ('checkForAllImagesLoaded') के बराबर पर अमल करने की कोशिश करेंगे' वैश्विक क्षेत्र है, जहां कोई नाम नहीं है में 'checkForAllImagesLoaded' परिभाषित किया। –

1

अपने कोड के साथ, आप प्रति कॉल समय समाप्ति के एक नंबर की स्थापना की। आपको प्रति दिन checkForAllImagesLoaded() कॉल पर एक बार टाइमआउट सेट करना चाहिए और शायद प्रतीक्षा अवधि बढ़ाएं (20 मिलीसेकंड बहुत तेज है)। जैसे

function checkForAllImagesLoaded() { 
    var allComplete=true; 
    var i=0; 

    while (i<images.length && allComplete) { 
    allComplete=images[i++].complete; 
    } 

    if (!allComplete) { // Any incomplete images? 
    setTimeout('checkForAllImagesLoaded()',1000); // Wait a second! 
    } 
} 
संबंधित मुद्दे