अजीब क्रोम प्रोटोटाइप / jQuery संघर्ष

वोट
24

हम विरासत कोड है कि प्रोटोटाइप पर निर्भर करता है के साथ एक आवेदन पत्र है, लेकिन हमने पाया है कि यह बहुत 'भारी' होने के लिए स्थानों के अधिकांश के लिए हम इसका उपयोग करना चाहते हैं और और हम कैसे काम के लिए एक बेहतर फिट होने के लिए jQuery मिल गया है। इसलिए हम नई कार्यक्षमता के लिए jQuery की ओर पलायन कर रहे हैं।

इस बीच में हम कई पृष्ठों दोनों पुस्तकालयों लोड करने के लिए की आवश्यकता है:

<script language=javascript type=text/javascript
        src=prototype-1.5.1.2.js></script> 
<script language=javascript type=text/javascript  
        src=jquery-1.3.2.js></script> 
<script language=javascript type=text/javascript>
    $j = jQuery.noConflict();
</script> 

(प्रोटोटाइप के पुराने संस्करण ध्यान दें, हम उन्नयन पर मुद्दों है कि हम नहीं चाहते पाया जब हम समाप्त कर रहे हैं किसी भी तरह ठीक करने के लिए)

यह IE6, IE7, IE8 के रूप में 7 और FX3 में काम करता है, लेकिन क्रोम में लोड और सभी jQuery सामान विफल रहता है।

डेवलपर JavaScript कंसोल निम्न त्रुटियों को प्रदर्शित करता है अप लोड हो रहा है:

Uncaught Error: NOT_SUPPORTED_ERR: DOM Exception 9 http://.../prototype-1.5.1.2.js (line 1272)
Uncaught TypeError: Object #<an Object> has no method 'ready' http://.../lib.js (line 161)
Uncaught TypeError: Object #<an Object> has no method 'slideUp' http://.../page.aspx (line 173)
... and so on - all the failures are missing jQuery methods

तो इस प्रोटोटाइप में एक संघर्ष है कि विफल jQuery वस्तु के निर्माण का कारण बनता है की तरह लग रहा है।

विशिष्ट प्रोटोटाइप मुद्दा जब यह नहीं होना चाहिए के रूप में XPath document.evaluate समर्थित नहीं है जा Prototype.BrowserFeatures.XPath सच किया जा रहा प्रतीत होता है।

ठीक है, तो अब सब काम करता है यह - JavaScript कंसोल खोलकर इसका पृष्ठ पुनः लोड! WTF? कंसोल को बंद करें, लोड करें और फिर विफल रहता है।

असफलता केवल तब होता है जब पेज लोड JavaScript कंसोल खोलकर के बिना होता है - क्यों कि कोई फर्क होगा? यही कारण है कि बहुत ज्यादा Chrome में बग की तरह दिखता है।

किसी को भी समझाने में सक्षम गलत क्या हो रहा है? क्यों प्रोटोटाइप में एक त्रुटि jQuery init विफल हो जाना चाहिए? क्यों कंसोल खोलकर कर यह काम के साथ पृष्ठ लोड हो रहा है?

किसी को भी एक अच्छी युक्ति पता है? (अलग प्रोटोटाइप-1.6.0.3.js के उन्नयन, जो इस समस्या का समाधान कर लेकिन कहीं विरासत कोड का भार टूट जाता है से)

07/05/2009 को 09:27
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
44

से कोर / jQuery.noConflict :

नोट: यह समारोह jQuery जावास्क्रिप्ट फ़ाइल को जोड़ने के बाद बुलाया जाना चाहिए, लेकिन इससे पहले कि इस मामले में jQuery पिछले शामिल किया गया है किसी भी अन्य परस्पर विरोधी पुस्तकालय सहित, और भी पहले वास्तव में है कि अन्य परस्पर विरोधी पुस्तकालय इस्तेमाल किया जाता है। noConflict jQuery.js फ़ाइल के अंत में कहा जा सकता है विश्व स्तर पर $ () jQuery उर्फ निष्क्रिय करने के लिए। jQuery.noConflict jQuery के लिए एक संदर्भ देता है, तो यह jQuery वस्तु की $ () उर्फ ओवरराइड करने के लिए इस्तेमाल किया जा सकता।

हो सकता है कि करने के लिए इसे बदलने का प्रयास करें:

<script language="javascript" type="text/javascript"
  src="jquery-1.3.2.js"></script> 
<script language="javascript" type="text/javascript">
    $j = jQuery.noConflict();
</script>
<script language="javascript" type="text/javascript"
  src="prototype-1.5.1.2.js"></script>
07/05/2009 को 19:45
का स्रोत उपयोगकर्ता

वोट
10

मैंने पाया इस समस्या के मूल होने के लिए:

  1. प्रोटोटाइप लोड होता है और क्योंकि वेबकिट का अभाव है document.getElementsByClass(), प्रोटोटाइप (insidously) यह पैदा करता है।

  2. jQuery आरंभीकरण शुरू होता है, और बहुत शीर्ष पर, यह सेट window.$करने के लिए jQuery

  3. JQuery के प्रारंभ के दौरान कड़ाके की धूप इंजन (1.3.2 में जोड़ा?) Initializes। इसके आत्मनिरीक्षण के हिस्से के रूप में, इसके लिए जाँच करता है, और उसके बाद की कार्यक्षमता का परीक्षण करती है document.getElementsByClass()। नतीजतन, यह प्रोटोटाइप के impelementation कॉल getElementsByClass(), जो पर निर्भर करता है window.$प्रोटोटाइप के लिए स्थापित किया जा रहा $है, न कि jQuery के।

अंत में, यह jQuery में लगाई जानी (टिकट देखने की आवश्यकता होगी http://bugs.jquery.com/ticket/4365 और 5027 )। मेरे त्वरित पैच करने के लिए काम निकालने के लिए था window.$jQuery के प्रारंभ के शीर्ष में।

16/12/2009 को 14:11
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more