2009-10-28 5 views
5

से जावास्क्रिप्ट लाइब्रेरी को शामिल करने का मानक तरीका मैं अपने जावास्क्रिप्ट से jquery लाइब्रेरी में खींचना चाहता हूं।जावास्क्रिप्ट

क्या यह 100% समय काम करता है? क्या कोई बेहतर तरीका है?

(function() { 

var loadJquery = function (cb) { 
    var addLibs = function() { 
     if (typeof(document.body) == "undefined" || document.body === null) { 
      setTimeout(addLibs, 100); 
      return; 
     } 

     var node = document.createElement("script"); 
     node.src = "http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"; 
     document.body.appendChild(node); 
     checkLib(); 
    }; 

    var checkLib = function() { 
     if (typeof($) == "undefined" || $("*") === null) { 
      setTimeout(checkLib, 100); 
      return; 
     } 
     cb($.noConflict()); 
    } 
    addLibs(); 
} 

loadJquery(function($){ 
    // Do stuff with $ 
    $(document.body).css("background", "black"); 
}); 

})(); 

बदलें node.src और $.noConflictYUI करने के लिए आप YUI3 चाहते हैं, या YAHOO अगर आप YUI2 कर रहे हैं, आदि

उत्तर

2

काम पर हमारी आंतरिक मेलिंग सूची पर पोस्ट करने से, मैं इस ओर इशारा किया गया था:

कई क्रॉस-ब्राउज़र बढ़त मामलों गतिशील इंजेक्शन लगाने स्क्रिप्ट में शामिल रहे हैं। यदि आपकी स्क्रिप्ट में वाईयूआई 3 बीज फ़ाइल रोलिंग एक विकल्प नहीं है और यदि आप पहले से वाईयूआई 3 बीज लोड करने के लिए संपत्ति पर निर्भर नहीं हैं, तो मैं बूटस्ट्रैप पर LazyLoad (लापरवाह प्लग) का उपयोग करने की सलाह दूंगा स्क्रिप्ट: http://github.com/rgrove/lazyload/

आपके पास अपनी स्क्रिप्ट में lazyload.js विलय कर सकते हैं, तो YUI 3 बीज लोड करने के लिए इस की तरह कुछ का उपयोग करता है, तो यह पहले से ही पृष्ठ में नहीं हैं:

(function() { 
    function init() { 
    YUI().use('node', function (Y) { 
     // ... do my stuff ... 
    }); 
    } 

    if (YUI) { 
    init(); 
    } else { 
    LazyLoad.js('http://yui.yahooapis.com/3.0.0/build/yui/yui-min.js', 
init); 
    } 
})(); 
4

सिर्फ एक ही मुद्दा मैं इस दृष्टिकोण के साथ के बारे में सोच सकते हैं (और यह आ गया है है पिछले महीने SO में प्रश्नों में दो बार)।

मुद्दा यह है कि 1.3.2 के रूप में jQuery अगर दस्तावेज़ अगर यह करने के बाद दस्तावेज़ गैर में (यानी गतिशील <script> शामिल किए जाने के रूप में आप कर रहे हैं, बुकमार्कलेट, आदि) के लोड होते ही अपने आप में शामिल है भरी हुई है पता नहीं लगा सकता है - आईई ब्राउज़र। ऐसे मामलों में समारोह .ready() को पारित नहीं किया जाएगा।

इस मुद्दे के लिए बग रिपोर्ट यहां दी गई है: http://dev.jquery.com/ticket/4196 पिछले 8 महीनों से इसके साथ कुछ भी नहीं हुआ है।

अब, जिस तरह से आपने loadJquery डिज़ाइन किया है, जैसा कि मैंने देखा है इसे प्रभावी ढंग से $(document).ready() को प्रतिस्थापित करना चाहिए ताकि आपको चिंता करने की आवश्यकता न हो। लेकिन $(document).ready() फ़ंक्शन-पासिंग शैली में लिखा गया कोई भी कोड निष्पादित नहीं होगा।

+0

हू, यह जानना वाकई अच्छा है। मुझे थोड़ी देर पहले यह समस्या हो रही थी और इसमें कोई संकेत नहीं था कि यह क्यों हो रहा था। –

+0

यह पता लगाने के लिए jQuery पर भरोसा करने के बजाय कि यह लोड हो गया है, क्या आप jQuery के शामिल होने के बाद अपना खुद का