जावास्क्रिप्ट के साथ jQuery लोड करें और jQuery का उपयोग करें


85

मैं jQuery लाइब्रेरी को डोम के साथ जोड़ रहा हूँ:

 var script = document.createElement('script');
 script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
 script.type = 'text/javascript';
 document.getElementsByTagName('head')[0].appendChild(script);

हालाँकि जब मैं दौड़ता हूँ:

jQuery(document).ready(function(){...

कंसोल त्रुटि की रिपोर्ट करता है:

Uncaught ReferenceError: jQuery is not defined

मैं डोम में एक बार गतिशील रूप से उपयोग करने के साथ-साथ jQuery को कैसे लोड करूं?


2
क्या कोई कारण है कि आप इसे बनाम अधिक अनुकूलित तरीके से करना चाहते हैं?
कोड मावरिक

इस सवाल के कुछ जवाब आपकी मदद कर सकते हैं - stackoverflow.com/questions/7474354/…
mrtsherman

@ सच बोलो मेरे पास एक एप्लिकेशन है जिसमें स्थापना के समय यह स्क्रिप्ट के साथ-साथ दोनों jquery को लोड करता है। मुझे स्क्रिप्ट के भीतर jquery लोड करने की आवश्यकता है ताकि jquery उपयोगकर्ता विषयों को न तोड़ें। मुझे उनके विषय के भीतर एक निश्चित वेबपेज पर जावास्क्रिप्ट को सशर्त लोड करने की आवश्यकता है। कृपया इस पर मेरा विश्वास करो।
थॉमसरेजी

JQuery उपयोगकर्ताओं की थीम क्यों तोड़ देगा? यदि लोडिंग jQuery (जिसका सीएसएस पर कोई प्रभाव नहीं है) थीम को तोड़ सकता है, तो आप कुछ गलत कर रहे हैं।
एंडर्स टॉर्बलाड

अच्छी बात है, लेकिन, क्या होगा अगर वे jQuery या किसी अन्य लाइब्रेरी के पुराने संस्करण का उपयोग कर रहे हैं?
थॉमसरेजी

जवाबों:


140

यहाँ एक छोटा सा उदाहरण के साथ एक कामकाजी JSField है, जो वास्तव में वही दिख रहा है जो आप खोज रहे हैं (जब तक कि मैंने आपके अनुरोध को गलत नहीं समझा है) : http://jsfiddle.net/9N7Z2/188/

डायनामिक रूप से जावास्क्रिप्ट लोड करने की उस पद्धति के साथ कुछ समस्याएँ हैं। जब यह बहुत ही बेसल फ्रेमवर्क की बात आती है, तो jQuery की तरह, आप वास्तव में शायद उन्हें स्टेटिकली लोड करना चाहते हैं, क्योंकि अन्यथा, आपको पूरे जावास्क्रिप्ट लोडिंग फ्रेमवर्क को लिखना होगा ...

आप कुछ मौजूदा जावास्क्रिप्ट लोडर का उपयोग कर सकते हैं, या window.jQueryपरिभाषित करने के लिए देख कर अपना स्वयं का लिख ​​सकते हैं ।

// Immediately-invoked function expression
(function() {
    // Load the script
    var script = document.createElement("SCRIPT");
    script.src = 'https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js';
    script.type = 'text/javascript';
    script.onload = function() {
        var $ = window.jQuery;
        // Use $ here...
    };
    document.getElementsByTagName("head")[0].appendChild(script);
})();

बस याद रखें कि यदि आपको वास्तव में पुराने ब्राउज़रों का समर्थन करने की आवश्यकता है, जैसे IE8, loadइवेंट हैंडलर निष्पादित नहीं करते हैं। उस स्थिति में, आपको window.jQueryबार-बार उपयोग करने की मौजूदगी के लिए चुनाव करने की आवश्यकता होगी window.setTimeout। यहाँ उस विधि के साथ एक कार्यशील JSFiddle है: http://jsfiddle.net/9N7Z2/3/

बहुत सारे लोग ऐसे हैं जो पहले ही कर चुके हैं जो आपको करने की आवश्यकता है। मौजूदा जावास्क्रिप्ट लोडर ढांचे में से कुछ की जाँच करें, जैसे:


यह समाधान वर्डप्रेस को छोड़कर काम करता है। किसी भी तरह से यह एक अलग वस्तु में jQuery लोड करने के लिए संशोधित किया जा सकता है?
क्रांग प्राइम

@SanuelJackson Wordpress के साथ, आपको wp_enqueue_script()jQuery को ठीक से शामिल करने के लिए फ़ंक्शन का उपयोग करना चाहिए । दस्तावेज़ीकरण: codex.wordpress.org/Function_Reference/wp_enqueue_script कुछ और जानकारी यहाँ: digwp.com/2009/06/including-jquery-in-wordpress-the-right-way/ यहाँ: digwp.com/2011/09/using- इसके बजाय jquery-of-wordpress
एंडर्स टॉर्बलाड

हां, जो मैं कह रहा था कि उपरोक्त कोड वर्डप्रेस पर काम नहीं करता है क्योंकि यह jQuery को असंगत रूप से लोड करता है। भले ही यह स्क्रिप्ट पृष्ठ के बहुत नीचे लोड की गई हो (HTML बंद करने से पहले), jQuery पूरी तरह से 'इनिशियलाइज़्ड' नहीं है और इस प्रकार यह कोई jQuery लोड नहीं देखता है, और कॉलबैक को लोड और करना जारी रखता है। एक बार लोड होने के बाद, यह अन्य चीजों को लोड करता है जो async पर लोड किए गए थे जो कि jQuery पर निर्भर थे एक अलग तरीके (जैसे $, jQuery, आदि) लोड किए जा रहे थे, या jQuery के एक अलग संस्करण पर निर्भर थे।
क्रांग प्राइम

मैंने जिन अन्य मामलों की कोशिश की, उनमें यह बहुत अच्छा है। सिर्फ इस के साथ एकमात्र समस्या का एक नोट बना रहा था। अगर किसी तरह इसे ट्यून किया जा सकता है, लेकिन मुझे नहीं लगता कि यह संभव है क्योंकि यह jQuery का पता लगाने पर निर्भर करता है, जो निश्चित रूप से लोड नहीं है, और इस प्रकार केवल तर्क के साथ आगे बढ़ सकते हैं - अगर कोई jquery ... तो ..
क्रांग प्राइम

1
आपको मतदान करने की आवश्यकता नहीं है, आप केवल एक पंक्ति का उपयोग करने के लिए प्रतीक्षा कर सकते हैं, जब तक कि जंकरी लोड का उपयोग करने के लिए इंतजार न करें। stackoverflow.com/a/42013269/3577695
aljgom

7

JQuery को गतिशील रूप से लोड करने का एक और तरीका है ( स्रोत )। आप भी इस्तेमाल कर सकते हैं

document.write('<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"><\/script>');

इसे उपयोग करने के लिए बुरा अभ्यास माना जाता है document.write, लेकिन पूरा होने के लिए इसका उल्लेख करना अच्छा है।

देखें कि डॉक्यूमेंट क्यों लिखा गया है? कारणों के लिए। समर्थक है कि है document.writeतो उसे कॉलबैक फ़ंक्शन बनाने के लिए कोई जरूरत नहीं है, अन्य assests लोड करने से आपके पेज को ब्लॉक करता है।


1
मैं आपके द्वारा लिंक किए गए दस्तावेज़ को पढ़ता हूं, और IE8 के लिए पुराने jQuery लाइब्रेरी को लोड करने के मेरे उपयोग के मामले के लिए, document.write का उपयोग करना ठीक लगता है। यह मेरे लिए अब तक अच्छा काम कर रहा है।
एलन

यह ऐसा करने का सबसे आसान और सरल तरीका है। क्या एक बड़ी स्क्रिप्ट की शुरुआत में ऐसा करने में कोई समस्या होगी जो एक अलग JS फाइल है? पास होना बहुत अच्छा है।
अगस्टिन लाडो

6

एनकोसिया की वेबसाइट सुझाती है:

<script type="text/javascript" 
        src="http://www.google.com/jsapi"></script>
<script type="text/javascript">
  // You may specify partial version numbers, such as "1" or "1.3",
  //  with the same result. Doing so will automatically load the 
  //  latest version matching that partial revision pattern 
  //  (e.g. 1.3 would load 1.3.2 today and 1 would load 1.7.2).
  google.load("jquery", "1.7.2");

  google.setOnLoadCallback(function() {
    // Place init code here instead of $(document).ready()
  });
</script>

लेकिन यहां तक ​​कि वह स्वीकार करते हैं कि यह सिर्फ निम्नलिखित प्रदर्शन करने की तुलना नहीं करता है जब यह इष्टतम प्रदर्शन के लिए आता है:

    <script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.7.2.min.js" type="text/javascript"></script>
    <script type="text/javascript"> window.jQuery || document.write('<script src="js/libs/jquery-1.7.2.min.js">\x3C/script>')</script>
    <script type="text/javascript" src="scripts.js"></scripts>
</body>
</html>

मैं केवल एक जावास्क्रिप्ट लोड कर सकता हूं। इसका मतलब है कि मुझे Google को उस लोड jquery से गतिशील रूप से jsapi लोड करना होगा? मेरे उपयोग के मामले के लिए बेमानी लगता है।
थॉमसरेजी

1
यह वही है जो एक jQuery लोडर करता है। आप लोडर को संदर्भित करते हैं और लोडर आपके लिए दस्तावेज़ में jQuery को इंजेक्ट करता है।
कोड मावरिक

3

आपको अपना कोड AFTER jQuery समाप्त लोड करने के लिए चलाने की आवश्यकता है

var script = document.createElement('script'); 
document.head.appendChild(script);    
script.type = 'text/javascript';
script.src = "//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js";
script.onload = function(){
    // your jQuery code here
} 

या यदि आप इसे एक async फ़ंक्शन में चला रहे हैं तो आप awaitउपरोक्त कोड में उपयोग कर सकते हैं

var script = document.createElement('script'); 
document.head.appendChild(script);    
script.type = 'text/javascript';
script.src = "//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js";
await script.onload
// your jQuery code here

यदि आप पहले चेक करना चाहते हैं कि क्या jQuery पहले से ही पेज में मौजूद है, तो यह प्रयास करें


0

आपके द्वारा यह त्रुटि प्राप्त करने का कारण यह है कि जावास्क्रिप्ट स्क्रिप्ट के लोड होने की प्रतीक्षा नहीं कर रहा है, इसलिए जब आप चलते हैं

jQuery(document).ready(function(){...

इस बात की कोई गारंटी नहीं है कि स्क्रिप्ट तैयार है (और कभी नहीं होगी)।

यह सबसे सुंदर समाधान नहीं है, लेकिन इसके व्यावहारिक है। अनिवार्य रूप से आप jQuery ऑब्जेक्ट विज्ञापन चलाने के लिए हर 1 सेकंड की जाँच कर सकते हैं जब इसके कोड में लोड होता है। मैं एक टाइमआउट (20 बार चलाने के बाद क्लियरटाइम) कहता हूं कि चेक को अनिश्चित काल तक रोकने के लिए।

var jQueryIsReady = function(){
    //Your JQuery code here
}

var checkJquery = function(){
    if(typeof jQuery === "undefined"){
        return false;
    }else{
        clearTimeout(interval);
        jQueryIsReady();
    }
}
var interval = setInterval(checkJquery,1000);

0

आवश्यकता का उपयोग करते हुए। यदि आप एक ही काम को सुरक्षित तरीके से कर सकते हैं। आप सिर्फ jquery पर अपनी निर्भरता को परिभाषित कर सकते हैं और फिर उस कोड को निष्पादित कर सकते हैं जिसे आप निर्भरता का उपयोग करना चाहते हैं जब यह नामस्थान को प्रदूषित किए बिना लोड किया जाता है:

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

<title>jQuery+RequireJS Sample Page</title>
   <script src="scripts/require.js"></script>
   <script>
   require({
       baseUrl: 'scripts',
       paths: {
           jquery: 'https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min'
       },
       priority: ['jquery']
    }, ['main']);
    </script>

0

HTML:

<html>
  <head>

  </head>
  <body>

    <div id='status'>jQuery is not loaded yet.</div>
    <input type='button' value='Click here to load it.' onclick='load()' />

  </body>
</html>   

स्क्रिप्ट:

   <script>

        load = function() {
          load.getScript("jquery-1.7.2.js");
          load.tryReady(0); // We will write this function later. It's responsible for waiting until jQuery loads before using it.
        }

        // dynamically load any javascript file.
        load.getScript = function(filename) {
          var script = document.createElement('script')
          script.setAttribute("type","text/javascript")
          script.setAttribute("src", filename)
          if (typeof script!="undefined")
          document.getElementsByTagName("head")[0].appendChild(script)
        }

        </script>

स्क्रिप्ट लोड होने के बाद मुश्किल भाग स्क्रिप्ट को चलाने के लिए है ... और कभी स्क्रिप्ट अपरिभाषित क्यों होगी?!
एंडर्स टॉर्बलाड

0

से DevTools कंसोल, आप चला सकते हैं:

document.getElementsByTagName("head")[0].innerHTML += '<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"><\/script>';

उपलब्ध jQuery संस्करण की जाँच करें https://code.jquery.com/jquery/ पर

यह लोड किया गया है या नहीं यह देखने के लिए, देखें: जावास्क्रिप्ट का उपयोग करके यदि जक्वेरी लोड की गई है या नहीं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.