एक से अधिक संस्करण लोड हो रहा है मेरी वेबसाइट पर मैं सबसे जावास्क्रिप्ट RequireJs एसिंक्रोनस रूप का उपयोग करके लोड। निम्नलिखितRequireJs मुद्दा जब jQuery
require(['DisplayAccordion']);
कहाँ DisplayAccordion.js शामिल:
require.config({
paths: {
'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery'
},
shim: {
'jquery.accordion': {
deps: ['jquery']
}
}
});
मैं निम्नलिखित कोड शरीर के भीतर परिभाषित एक फ़ाइल एसिंक्रोनस रूप से लोड करने के लिए है कहते हैं: कृपया मेरे RequireJs विन्यास के लिए निम्न देखें
define(['jquery', 'jquery.accordion'], function($) {
$(function() {
$('.xyz').accordion();
});
});
नोट: jquery.accordion बस एक jQuery प्लगइन है जिसमें एएमडी समर्थन नहीं है और वैश्विक jQuery चर परिभाषित करने की आवश्यकता है।
यह ठीक काम करता है, लेकिन अब कहते हैं कि मैं एक तीसरी पार्टी पुस्तकालय करने के लिए अपने पृष्ठ पर एक स्क्रिप्ट संदर्भ छोड़ देते हैं। उदाहरण के लिए:
<script src="//example.com/ThirdParty.js"></script>
जहां तीसरी पार्टी लाइब्रेरी jQuery का अपना संस्करण लोड करती है। अब मैं त्रुटि हो रही है:
Object doesn't support property or method 'accordion'.
कोड मैंने पाया कि यह निम्न क्रम में कार्यान्वित के माध्यम से कदम के बाद:
- ThirdParty.js
- jquery.min.js - तीसरे पक्ष के संस्करण
- jquery.min.js - मेरी संस्करण
- jquery.accordion.js - जहां jQuery
- Displ की मेरी संस्करण संदर्भ के लिए $ अंक ayAccordion.js (कॉलबैक फ़ंक्शन) - जहां jQuery
पर तीसरे पक्ष संस्करण के लिए $ अंक अब मैं देख सकता हूं कि मुझे त्रुटि क्यों मिलती है क्योंकि प्लगइन किसी भिन्न ऑब्जेक्ट से जुड़ा हुआ है। हालांकि मुझे यकीन है कि क्यों यह इस करना होगा नहीं कर रहा हूँ।
नीचे दी गई जानकारी बस समझाएगी कि $ .noConflict (true) का उपयोग क्यों नहीं करेगा।
मुद्दे पर कुछ शोध करने के बाद। मैं अपने config संशोधित:
require.config({
paths: {
'jquery': '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery'
},
map: {
'*': { 'jquery': 'jquery-private' },
'jquery-private': { 'jquery': 'jquery' }
},
shim: {
'jquery.accordion': {
deps: ['jquery']
}
}
});
कहाँ jQuery-private.js के रूप में परिभाषित किया गया है:
define(['jquery'], function($) {
return $.noConflict(true);
});
कृपया ध्यान दें कि इस http://www.requirejs.org/docs/jquery.html#noconflictmap
अब यह निम्न क्रम में कार्यान्वित से लिया गया है:
- ThirdParty.js
- jquery.min.js - तीसरे पक्ष के संस्करण
- jQuery-private.js (कॉलबैक फ़ंक्शन)
- jquery.min.js - मेरी संस्करण
- jquery.accordion.js - जहां $ अपरिभाषित है
- DisplayAccordion ।js (कॉलबैक फ़ंक्शन) - जहां के तीसरे पक्ष के संस्करण jQuery के लिए $ अंक
आप कल्पना कर सकते हैं यह या तो काम नहीं के बाद से $ jquery.accordion.js फ़ाइल के भीतर अपरिभाषित है।
$.noConflict(true);
मुझे लगता है कि मैं समझता हूँ कि यहाँ क्या हो रहा है:
आगे डिबगिंग की abit बाद मैं तीसरे पक्ष के पुस्तकालय भी कहता है की खोज की। जब यह तीसरे पक्ष की लाइब्रेरी में $ .noConflict (true) को कॉल करता है तो यह वैश्विक संस्करण $ और jQuery को पिछले संस्करण में सेट करने का प्रयास करता है। हालांकि चूंकि कोई पिछले संस्करण लोड नहीं हुआ है, यह अपरिभाषित पर सेट है।
अब जब यह jquery-private.js को कॉल करता है और $ देता है .noConflict (true) यह वैश्विक jQuery चर वापस लौटाएगा जिसे अपरिभाषित करने के लिए सेट किया गया है। हालांकि अब यह वैश्विक jQuery चर पुस्तकालय के तीसरे पक्ष संस्करण में सेट करेगा।
तो जब यह jquery.accordion $ लोड करता है तो अपरिभाषित होता है। लेकिन जब यह अगला DisplayAccordion.js को कॉल करता है तो यह अब jQuery लाइब्रेरी के तीसरे पक्ष संस्करण का संदर्भ दे रहा है।
अगर कोई फिक्स सुझा सकता है तो मैं इसकी सराहना करता हूं। धन्यवाद
इससे समस्या ठीक नहीं होगी। ध्यान दें कि ओपी के प्रयास (दोनों प्रयासों) के अंतिम चरण में, 'डिस्प्लेएक्ॉर्डियन' मॉड्यूल, जो * मॉड्यूल के रूप में * jquery' लोड करता है, ओपी चाहता है संस्करण के बजाए jQuery का तीसरा पक्ष संस्करण प्राप्त करता है। आप यहां जो सुझाव देते हैं वह वही काम करेगा: 'jquery.accordion' को ओपी चाहता है की बजाय jQuery का तीसरा पक्ष संस्करण मिलेगा। अगर मेरे उत्तर में समझाया गया तो ऐसा क्यों होता है। – Louis
दोह - मैं देखता हूं - आपके उत्तर में बड़ी समस्या यह है कि यह इस तथ्य को अनदेखा करता है कि ओपी के पास लोड ऑर्डर का कोई नियंत्रण नहीं है (यही कारण है कि यह सूचनात्मक के अलावा किसी अन्य तरीके से मदद नहीं करता है)। 'Jquery' के बजाय 'jquery-private' मॉड्यूल का उपयोग करने के बारे में - इसे अभी भी लिपटे होने के लिए एग्रीजन की आवश्यकता होगी, लेकिन सही संस्करण का उपयोग किया जाना चाहिए ... – Rycochet
' jquery-private' का उपयोग करना समस्या को ठीक नहीं करेगा । प्रश्न में दूसरे प्रयास में ओपी ने यही किया। जैसा कि मैंने अपनी पिछली टिप्पणी में इंगित किया था, * * * प्रयास * प्रदर्शन 'निष्पादन' में गलत संस्करण मिलता है। मेरे उत्तर के मूल्य के लिए, हां, मैंने ओपी की टिप्पणी पढ़ी है और महसूस किया है कि यह काम नहीं करेगा अगर 'थर्डपार्टी.जेएस' से संबंधित ओपी के कोड का लोड ऑर्डर बाधित नहीं किया जा सकता है। रिकॉर्ड के लिए, ओपी ने * महत्वपूर्ण * चेतावनी को जोड़ा कि लोड ऑर्डर पर कोई नियंत्रण नहीं है * * मैंने अपना उत्तर पोस्ट किया है। किसी भी दर पर, मेरे लिए यह इंगित करता है कि आदेश को बाधित किया जाना चाहिए। – Louis