2009-12-08 12 views
8

के साथ दो स्क्रिप्ट जोड़ना मुझे प्रोटोटाइप जोड़ने की आवश्यकता है और फिर स्क्रिप्टैकुलर जोड़ने की आवश्यकता है और जब वे दोनों लोड हो रहे हैं तो कॉलबैक प्राप्त करें। मैं वर्तमान में तो जैसे प्रोटोटाइप लोड हो रहा हूँ:document.createElement ('script') ... एक कॉलबैक

var script = document.createElement("script"); 
script.src = "http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js"; 
script.onload = script.onreadystatechange = callback; 
document.body.appendChild(script); 

मैं कॉलबैक चेनिंग कर ऐसा कर सकता है, लेकिन है कि गरीब अभ्यास की तरह लगता है (मैं 20 कॉलबैक तरीकों में से एक मूर्खतापूर्ण श्रृंखला नहीं करना चाहती जब मैं अधिक स्क्रिप्ट लोड करने की आवश्यकता है)। विचार?

+0

आप उन स्क्रिप्ट को जावास्क्रिप्ट के साथ लोड करने के एक HTML में क्यों नहीं जोड़ते हैं? – RaYell

+2

मैं अपनी सामग्री को एम्बेड करने के लिए अन्य लोगों के एचटीएमएल में चिपकाने के लिए थोड़ा सा कोड बना रहा हूं। मैं केवल एक खाली div और मेरी जावास्क्रिप्ट फ़ाइल का संदर्भ चिपकाना चाहता हूं। – user199085

+0

@kdiegert: आपके जेएस फ़ाइल में यह संदर्भ चिपकाया गया है: आपका मतलब है ' '? –

उत्तर

33

मैं आपको कुछ छोटे लोडर का उपयोग करने का प्रस्ताव करता हूं जो आपके लिए श्रृंखला और सामान करेगा। उदाहरण के लिए:

function loadScripts(array,callback){ 
    var loader = function(src,handler){ 
     var script = document.createElement("script"); 
     script.src = src; 
     script.onload = script.onreadystatechange = function(){ 
      script.onreadystatechange = script.onload = null; 
      handler(); 
     } 
     var head = document.getElementsByTagName("head")[0]; 
     (head || document.body).appendChild(script); 
    }; 
    (function run(){ 
     if(array.length!=0){ 
      loader(array.shift(), run); 
     }else{ 
      callback && callback(); 
     } 
    })(); 
} 

यह स्क्रिप्ट आपको स्क्रिप्ट टैग बनाने और सभी फ़ाइलों को लोड होने पर कॉलबैक कॉल करने में आपकी सहायता करनी चाहिए। आह्वान बहुत आसान है:

loadScripts([ 
    "http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js", 
    "http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js" 
],function(){ 
    alert('All things are loaded'); 
}); 

आशा इस में मदद मिलेगी

+0

बिंगो। बहुत धन्यवाद। – user199085

+0

aysnc.parallel या async.series इस https://github.com/caolan/async –

+0

'arguments.callee' के साथ सख्त मोड में त्रुटि फेंकता है: https://developer.mozilla.org/en-US से मदद कर सकता है/दस्तावेज़/वेब/जावास्क्रिप्ट/संदर्भ/Strict_mode "' arguments.callee' अब समर्थित नहीं है। सामान्य कोड 'arguments.callee' में संलग्न कार्य को संदर्भित किया जाता है। यह उपयोग मामला कमजोर है: बस संलग्न कार्य का नाम दें! इसके अलावा, ' arguments.callee' इनलाइनिंग फ़ंक्शंस जैसे ऑप्टिमाइज़ेशन को काफी हद तक बाधित करता है, क्योंकि अगर तर्कों का उपयोग किया जाता है तो अन-इनलाइन फ़ंक्शन का संदर्भ प्रदान करना संभव हो सकता है। –

1

के बाद से scriptaculous प्रोटोटाइप की आवश्यकता है, तो आप श्रोताओं, जो कुछ भी विधि के साथ आप इन स्क्रिप्ट लोड करने के लिए उपयोग श्रृंखला करना होगा।

समान स्क्रिप्ट में जितनी जल्दी संभव हो सके स्क्रिप्ट लोड करने के लिए कई स्क्रिप्ट लोडर उपलब्ध हैं, उदा। LABjs, लेकिन इस परिदृश्य में कोई भी मदद करने जा रहा है।

यदि आप 10-20 स्क्रिप्ट लोड करने के लिए समाप्त होते हैं, तो मैं Combiner जैसे टूल का उपयोग करके स्क्रिप्ट को पहले से जोड़ना चाहता हूं।

+0

वास्तव में, यह परिदृश्य * बिल्कुल * क्या लैब्स था हल करने के लिए डिज़ाइन किया गया। –

2

इंटरनेट एक्सप्लोरर में एक बग की वजह से निमिस से रिकर्सिव लोडर प्रोग्राम आईई में सही काम नहीं कर रहा है। जैसे पुनरावर्ती कॉल पर एक देरी सेट करके किया जा सकता है:


function loadScripts(array,callback){ 
    var loader = function(src,handler){ 
     var script = document.createElement("script"); 
     script.src = src; 
     script.onload = script.onreadystatechange = function(){ 
      script.onreadystatechange = script.onload = null; 
      if(/MSIE ([6-9]+\.\d+);/.test(navigator.userAgent))window.setTimeout(function(){handler();},8,this); else handler(); 
     } 
     var head = document.getElementsByTagName("head")[0]; 
     (head || document.body).appendChild(script); 
    }; 
    (function(){ 
     if(array.length!=0){ 
       loader(array.shift(),arguments.callee); 
     }else{ 
       callback && callback(); 
     } 
    })(); 
} 

इस छोटे से हैक यह होता है, और अक्सर जब एक unexplainable समस्या तब होती है, जो भी अक्सर है आईई, में समाधान है।

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