2009-04-16 18 views
20

मुझे एक बुकमार्कलेट मिला है जो jQuery और कुछ अन्य जेएस पुस्तकालयों को लोड करता है।बुकमार्कलेट तब तक प्रतीक्षा करें जब तक जावास्क्रिप्ट लोड नहीं होता

मैं कैसे करूँ:

  • प्रतीक्षा जब तक जावास्क्रिप्ट पुस्तकालय मैं उपयोग कर रहा हूँ उपलब्ध है/भरी हुई। अगर मैं लोडिंग समाप्त होने से पहले स्क्रिप्ट का उपयोग करने का प्रयास करता हूं, जैसे लोड होने से पहले jQuery के साथ $ फ़ंक्शन का उपयोग करना, एक अपरिभाषित अपवाद फेंक दिया जाता है।
  • (स्पष्ट रूप से एक सर्वर हेडर का उपयोग कर, या बिना किया जा रहा है कि यह एक जावास्क्रिप्ट फ़ाइल है: एक मेटाटैग) बीमा उस बुकमार्कलेट मैं लोड कैश नहीं किया जाएगा

किसी को भी अवगत है अगर गतिशील के लिए ऑनलोड आईई में जोड़ा जावास्क्रिप्ट काम करता है? (इस post के विपरीत)

इन मुद्दों के लिए सबसे आसान समाधान, सबसे साफ समाधान क्या है?

+0

"जावास्क्रिप्ट लाइब्रेरी उपलब्ध होने तक प्रतीक्षा करें" कृपया इसे विस्तृत करें। आप किस का इंतजार कर रहे हैं? –

उत्तर

24

यह इस बात पर निर्भर करता है कि आप वास्तव में jQuery को कैसे लोड कर रहे हैं। यदि आप पृष्ठ पर एक स्क्रिप्ट तत्व जोड़ रहे हैं, तो आप उसी तकनीक का उपयोग कर सकते हैं जो jQuery स्क्रिप्ट को गतिशील रूप से लोड करने के लिए उपयोग करता है।

संपादित करें: मैंने अपना होमवर्क किया और वास्तव में आपके बुकमार्लेट में उपयोग करने के लिए jQuery कोड से लोडस्क्रिप्ट फ़ंक्शन निकाला। यह वास्तव में कई (मेरे सहित) के लिए उपयोगी हो सकता है।

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

    // Attach handlers for all browsers 
    var done = false; 
    script.onload = script.onreadystatechange = function() 
    { 
     if(!done && (!this.readyState 
        || this.readyState == "loaded" 
        || this.readyState == "complete")) 
     { 
      done = true; 

      // Continue your code 
      callback(); 

      // Handle memory leak in IE 
      script.onload = script.onreadystatechange = null; 
      head.removeChild(script); 
     } 
    }; 

    head.appendChild(script); 
} 


// Usage: 
// This code loads jQuery and executes some code when jQuery is loaded 
loadScript("https://code.jquery.com/jquery-latest.js", function() 
{ 
    $('my_element').hide(); 
}); 
+2

कला के टुकड़े से बाहर निकलें :) – vsync

+1

आपको टाइप = "टेक्स्ट/जावास्क्रिप्ट" निर्दिष्ट करने की आवश्यकता नहीं है ? – vsync

+1

और नहीं। आजकल ब्राउज़र मानते हैं कि बिना टाइप की गई स्क्रिप्ट जावास्क्रिप्ट – joeytwiddle

1

अपने पहले प्रश्न का उत्तर देने के लिए: जावास्क्रिप्ट को क्रमिक रूप से व्याख्या किया गया है, इसलिए लाइब्रेरी लोड होने तक कोई भी निम्न बुकमार्कलेट कोड निष्पादित नहीं होगा (माना जाता है कि लाइब्रेरी को सफलतापूर्वक व्याख्या किया गया था - कोई वाक्यविन्यास त्रुटियां नहीं)।

कैश नहीं होती से फाइल को रोकने के लिए, आप एक अर्थहीन क्वेरी स्ट्रिंग संलग्न कर सकते हैं ...

url = 'jquery.js?x=' + new Date().getTime(); 
+0

जाहिर है, गतिशील रूप से जोड़ा गया जावास्क्रिप्ट बिल्कुल वर्णन नहीं करता जैसा आप वर्णन करते हैं। तत्व addElement DOM फ़ंक्शन द्वारा जोड़ा जाता है और तुरंत लौटाता है। ऑनलोड मदद करता है, लेकिन मैं इस पोस्ट से परेशान हूं: http://answers.google.com/answers/threadview?id=595949 – cgp

+0

आपकी टिप्पणी सटीक नहीं है, खासकर जब इस प्रश्न की बात आती है। altCognito समस्या का वर्णन किया है, मुझे इसे थोड़ा स्पष्ट बनाने दें। यदि आपकी स्क्रिप्ट गतिशील रूप से एक स्क्रिप्ट टैग जोड़ती है, तो गतिशील टैग की सामग्री को तब तक पार्स नहीं किया जाएगा जब तक कि आप मौजूदा स्क्रिप्ट टैग –

0

मैं this साथ एक छोटी सी करीब है, लेकिन पूरी तरह से नहीं। यह एक अच्छा होगा, एक बुकमार्कलेट का उदाहरण जो दिखाता है कि कैशिंग से कैसे बचा जाए।

1

मैं एक ध्यान दिया है कि क्रोम में है कि लोड किए गए हैं स्क्रिप्ट के क्रम, अनिर्धारित है जब @Vincent रॉबर्ट के तकनीक का उपयोग कर। इस मामले में थोड़ा संशोधन मदद करता है:


(function() { 
    var callback = function() { 
     // Do you work 
    }; 
     // check for our library existence 
    if (typeof (MyLib) == 'undefined') { 
     var sources = [ 
       'http://ajax.cdnjs.com/ajax/libs/json2/20110223/json2.js', 
      'https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js', 
      'https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.13/jquery-ui.min.js', 
      'http://myhost.com/javascripts/mylib.min.js']; 

     var loadNextScript = function() { 
      if (sources.length > 0) { 
       var script = document.createElement('script'); 
       script.src = sources.shift(); 
       document.body.appendChild(script); 

       var done = false; 
       script.onload = script.onreadystatechange = function() { 
        if (!done 
          && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete")) { 
         done = true; 

         // Handle memory leak in IE 
         script.onload = script.onreadystatechange = null; 

         loadNextScript(); 
        } 
       } 
      } else { 
       callback(); 
      } 
     } 
     loadNextScript(); 

    } else { 
     callback(); 
    } 
})(); 
संबंधित मुद्दे

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