2010-08-14 11 views
5

मैं asyncronus अनुरोध को स्वीकार करने के लिए अपने आलसी लोडर मॉड्यूल के पुनर्निर्माण कर रहा हूँ (आलसी लोड करने के लिए) के साथ लेकिन मैं एक बड़ी समस्या है:
इंटरनेट एक्सप्लोरर script.onload का समर्थन नहीं करते/onerror !!!स्क्रिप्ट ऑनलोड/onerror आईई समस्याओं

पुरानी स्क्रिप्ट विश्व स्तर पर लक्ष्य स्क्रिप्ट स्रोत एक ajax सिंक कॉल, यह बहुत अच्छी तरह से काम करता है के साथ पठित eval थी, इसे पार ब्राउज़र है और मैं इसे संपादन 1 चर async कर सकते हैं, लेकिन यह (सभी स्रोत कोड डिबग करने के लिए बहुत मुश्किल है एक सिंगल लाइन में निष्पादित किया जाता है और ब्राउज़र त्रुटियों के बारे में ज्यादा जानकारी नहीं देता है, रेगेक्सपी के साथ कोड को कोड को विभाजित करना असंभव है क्योंकि जेएस में अनंत गहराई के साथ ब्लॉक हैं और regexp इस पर बस अच्छा नहीं है)।

यह (एक क्लासिक) कोड है कि मैं स्क्रिप्ट बनाने के लिए उपयोग करते हैं:

var script = document.createElement('script'); 
script.type = 'text/javascript'; 
script.src =name; 
script.name =name; 
script.async = true; 
script.onload=<my_onload_code>; 
script.onerror=<my_onerror_code>; 

यह IE पर काम नहीं करेगा क्योंकि यह समर्थन ऑनलोड doesen't और onerror स्क्रिप्ट के साथ;
नीचे कोड एक फिक्स है, लेकिन केवल तभी कारगर साबित स्क्रिप्ट async है नहीं

if(script.onreadystatechange!==undefined)//only IE T_T 
      script.onreadystatechange = function() { 
        if (script.readyState == 'loaded')//ERROR LOADING 
         <my_onerror_code>; 
        else 
        if(script.readyState == 'complete')//loaded 
         <my_onload_code>; 

      }; 

मैं हर एक्स मिलीसेकेंड यह परीक्षण कर सकते हैं जब तक स्क्रिप्ट लोड किया जाता है, लेकिन यह एक बदसूरत समाधान है और मैं इसे से बचना चाहते हैं।

संपादित करें: इस नहीं है कि बुरा कोड मैं अगर स्क्रिप्ट भरी हुई है हर एक्स एमएस जाँच करने के लिए tryed है, यह और यह ajax की तुलना में बेहतर काम करता है, समस्या यह है कि अगर स्क्रिप्ट लोड मुझे पता नहीं कर सकता है सफलता या त्रुटि के साथ (अधिभार या आतंक)।

var script = document.createElement('script'); 
script.type = 'text/javascript'; 
script.src =name; 
script.name =name; 
script.async = true; 

    script.onload=function(){Lazy_loader.onload(this);}; 
    script.onerror=function(){Lazy_loader.onerror(this);}; 

    if(script.onreadystatechange!==undefined){//ie fix T_T 
     script.timer=setInterval(function(){ 
        if (script.readyState == 'loaded' || script.readyState == 'complete')}//ERROR LOADING 

         if(LOADED???)//loaded 
          Lazy_loader.onload(script); 
         else 
          Lazy_loader.onerror(script); 

         clearInterval(script.timer); 
        } 

        },100); 

    } 

document.getElementsByTagName('head')[0].appendChild(script); 

मैं addEventListener/attachEvent कार्यों का उपयोग tryed लेकिन यह काम करने के लिए (यहां तक ​​कि वेब से addEvent कार्यों का प्रयोग करके)

विकल्पों का सारांश लगता होने लगते नहीं किया:

  • उपयोग AJAX और वैश्विक eval स्क्रिप्ट लोड करने के लिए (नरक डीबगिंग)
  • केवल AJ के साथ AJAX और वैश्विक eval का उपयोग करें (एक समाधान हो सकता है, मैं IE का उपयोग नहीं करता)
  • AJAX और gl का उपयोग करें ओबाल eval केवल अगर स्क्रिप्ट में त्रुटियां हैं (मुझे समय की समस्याएं जांचने की ज़रूरत है क्योंकि मेरे कोड के साथ मैं सिंक्रोनस कोड को अनुकरण करता हूं, भले ही कॉल एसिंक है)
  • टेस्ट स्क्रिप्ट.ऑनरेस्टस्टेटेन्चेंज (केवल आईई पर) प्रत्येक एक्स समय लोड होने तक (UGLY !!!)
  • विंडो का उपयोग करें। लोड: AVOID, इसे सभी पेज चार्ज करने की आवश्यकता है, मुझे केवल एक स्क्रिप्ट लॉन्च होने पर इसे कॉल करने की आवश्यकता है (अंत पृष्ठ पर विवरण देखें)
  • स्रोत पर एक कोड जोड़ें प्रत्येक स्क्रिप्ट की (बचें तरह endpage को कहा)
  • IE के लिए script.onload ठीक (का उपयोग कर addEventListener/attachEvent?!?)


कृपया भुगतान ध्यान:
मैं क्योंकि यह केवल निकाल दिया है, जब सभी पृष्ठ लोड होने पर मैं इसे आग जब केवल लक्ष्य स्क्रिप्ट लोड किया जाता है की जरूरत है window.onload का उपयोग नहीं करना चाहते हैं (मेरे आलसी लोड हो रहा है स्क्रिप्ट एक है बहुत अधिक जटिल तो कृपया पूछें क्यों नहीं);
मैं किसी तीसरे पक्ष की लाइब्रेरी (जैसे jquery, प्रोटोटाइप इत्यादि) का उपयोग नहीं करना चाहता हूं।),
मैं लक्ष्य स्क्रिप्ट स्रोत को संपादित करना भी नहीं चाहता (जैसे कि जेएसपीओएन का उपयोग करते समय या स्क्रिप्ट को लोड करने के लिए स्क्रिप्ट जोड़ने के लिए)।

आशा है कि यह बहुत अधिक नहीं है! धन्यवाद।

+1

msdn के अनुसार, स्क्रिप्ट ऑनलोड का समर्थन करता है http://msdn.microsoft.com/en-us/library/cc197055%28VS.85%29.aspx – mplungjan

+0

इसे आज़माएं, यह काम नहीं करेगा। यह सुरक्षा कारणों से

0

नीचे दिए गए जंक को अनदेखा करें। अगली सिब्लिंग चीज डीबगर में होने का परिणाम था और वास्तविक दुनिया में वास्तव में पुन: उत्पन्न नहीं हुई थी। इसके बजाय, मुझे www.requirejs.org

की जांच करने की सिफारिश करनी होगी, यह एक ऐसी विधि प्रदान करता है जो किसी भी शामिल या आयात विवरण के करीब है जैसा आप जेएस में पा सकते हैं।

यह एक पूरी तरह से गोफबॉल समाधान है, और यह इस धागे का पालन करेगा कि यह क्यों काम करता है, लेकिन यहां टाइमर के बिना मैंने इसे कैसे तय किया है।

var url = load_obj.url; 
var callback = load_obj.callback; 
var head = document.getElementsByTagName('head')[0]; 
var appendage; 
var complete = false;
appendage = document.createElement('script'); appendage.type = 'text/javascript'; appendage.onload = appendage.onreadystatechange = function() { if (!complete && (!this.readyState || this.readyState === 'complete' || (this.readyState === 'loaded' && this.nextSibling != null))) { console.log('loaded via all'); complete = true; if (callback) callback(); //remove listeners appendage.onload = appendage.onreadystatechange = null; } else if (this.readyState === 'loaded' && this.nextSibling == null) { console.log('error via ie'); } appendage.onerror = function() { console.log('error via everything else'); } appendage.src = url;

जैसे मैंने कहा कि मुझे नहीं पता कि अगली सिब्लिंग 404'd प्रयास पर शून्य है, लेकिन यदि जेएस यूआरएल सही था, तो अगले सिब्लिंग का मूल्य था।

+0

आगे परीक्षण के बाद, यह केवल डीबगिंग के दौरान काम करने लगता है - अगर (! पूरा ... कथन। – prodaea

+0

मैं शर्त लगा सकता हूं कि अगला सिब्लिंग शून्य है क्योंकि 404'इंग स्क्रिप्ट तत्व आपके परीक्षण में शीर्ष पर शामिल होने वाली आखिरी चीज है। – Borgar

1
script.onreadystatechange = function() { 
    if (script.readyState == 'loaded')//ERROR LOADING 
     <my_onerror_code>; 
    else if(script.readyState == 'complete')//loaded 
     <my_onload_code>; 

}; 

मैं कहना है कि भले ही async या सेट नहीं है, त्रुटि जाँच करने के लिए readyState = 'loaded' का उपयोग कर पर्याप्त नहीं है। वास्तव में, loaded त्रुटियों को लोड करने वाली स्थितियों या सही स्क्रिप्ट को लोड करने के लिए पहली बार ट्रिगर किया जाएगा।

आप कैश को अक्षम करने के लिए यादृच्छिक क्वेरी स्ट्रिंग के साथ src जोड़ सकते हैं, फिर readyState देखें।

0

इसे आजमाएं: https://stackoverflow.com/a/18840568/2785975। यहां आईए 7-8 के लिए आतंकवादी घटना के साथ समस्या का वर्णन किया गया है और निर्णय दिखाया गया है।

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