2010-05-10 15 views
5

अद्यतन:जब तक मेरी सभी एसिंक्रोनस जेएस फाइलें डाउनलोड नहीं हो जातीं तब तक मैं कुछ जेएस कोड चलाने में देरी कैसे कर सकता हूं?

मैं निम्नलिखित कोड:

<script type="text/javascript"> 
function addScript(url) { 
    var script = document.createElement('script'); 
    script.src = url; 
    document.getElementsByTagName('head')[0].appendChild(script); 
} 
addScript('http://google.com/google-maps.js'); 
addScript('http://jquery.com/jquery.js'); 

... 

// run code below this point once both google-maps.js & jquery.js has been downloaded and excuted 

</script> 

मैं कैसे क्रियान्वित जब तक सभी आवश्यक जे एस डाउनलोड किए जा चुके और मार डाला से कोड रोका जा सकता है? उपरोक्त मेरे उदाहरण में, उन आवश्यक फाइलें google-maps.js और jquery.js हैं।

+0

क्या इस प्रश्न का एक संस्करण हजारों बार नहीं पूछा गया है? –

उत्तर

6

आप सबसे ब्राउज़रों के लिए स्क्रिप्ट तत्व का onload घटना का उपयोग कर सकते हैं, और एक कॉलबैक तर्क का उपयोग करें:

संपादित करें: आप वास्तव में कोड के निष्पादन नहीं रोक सकता है जब आप इस तरह से स्क्रिप्ट लोड (और सिंक्रोनस अजाक्स अनुरोध करना ज्यादातर बार एक बुरा विचार है)।

लेकिन आप कर सकते हैं श्रृंखला कॉलबैक है, तो आप कुछ कोड है कि दोनों पर निर्भर करता है, Two.js और Three.js, अगर आप यह कर सकते श्रृंखला लोड हो रहा है कार्रवाई, उदाहरण के लिए:

loadScript('http://example.com/Two.js', function() { 
    // Two.js is already loaded here, get Three.js... 
    loadScript('http://example.com/Three.js', function() { 
    // Both, Two.js and Three.js loaded... 
    // you can place dependent code here... 
    }); 
}); 

कार्यान्वयन:

function loadScript(url, callback) { 
    var head = document.getElementsByTagName("head")[0], 
     script = document.createElement("script"), 
     done = false; 

    script.src = url; 

    // Attach event handlers for all browsers 
    script.onload = script.onreadystatechange = function(){ 
    if (!done && (!this.readyState || // IE stuff... 
     this.readyState == "loaded" || this.readyState == "complete")) { 
     done = true; 
     callback(); // execute callback function 

     // Prevent memory leaks in IE 
     script.onload = script.onreadystatechange = null; 
     head.removeChild(script); 
    } 
    }; 
    head.appendChild(script); 
} 

IE के लिए, onreadystatechange घटना बाध्य होने के लिए है।

+0

मैं थोड़ा उलझन में हूं, तो क्या मुझे उपरोक्त कोड या कोड से भी लिंक करना चाहिए? – Henryh

+0

@ हेनरीह, मेरे द्वारा लिंक किए गए कोड का उपयोग करें, यह क्रॉस-ब्राउज़र है, और यह आईई पर समस्याओं के बिना काम करेगा, यह कुछ प्रसिद्ध [मेमोरी लीक] (http://ajaxian.com/archives/dynamic-script) की भी परवाह करता है -जनन-और-स्मृति-लीक), मैं इसे * क्रॉस-पोस्ट * नहीं करना चाहता था ... – CMS

+0

ठीक है, धन्यवाद सीएमएस। क्या आप दिये गये पृष्ठ पर कोड के समान होने के लिए ऊपर अपना कोड अपडेट करना चाहते हैं। भविष्य के लोगों को यह जानने के लिए कि कौन सा कोड उपयोग करना है, इससे यह कम भ्रमित हो जाएगा। एक बार फिर धन्यवाद। – Henryh

0

मैंने अभी CMS's answer पढ़ा है, और निर्णय लिया है कि अपने "अधिकांश ब्राउज़रों" टिप्पणी से, मुझे उन लोगों के लिए काम करने में एक क्रैक हो सकता है, जो इस कार्यक्षमता को मूल रूप से नहीं रखते हैं।

असल में, यह एक अंतराल है जो एक चर के लिए चुनाव करता है।

var poll = window.setInterval(function() { 

    if (typeof myVar !== 'undefined') { 
     clearInterval(poll); 
     doSomething(); 
    }; 

}, 100); 
+2

हां, * "अधिकांश ब्राउज़रों" * द्वारा मैं आमतौर पर कुछ भी संदर्भित करता हूं जो IE नहीं है :) – CMS

+0

@CMS सुनिश्चित नहीं है कि मेरा उत्तर तब कुछ जोड़ता है। यह थोड़ा हैकी है, खासकर अगर बेहतर विकल्प हैं। – alex

+0

अच्छी तरह से, व्यक्तिगत रूप से मुझे टाइम्स पसंद नहीं करते हैं जब आप ईवेंट का उपयोग कर सकते हैं, हालांकि यह एक पूरी तरह से वैध उत्तर है ... – CMS

संबंधित मुद्दे

 संबंधित मुद्दे