2013-10-21 11 views
6

एक आईपीथॉन नोटबुक में, कोई निम्न कोड को रैपेल.जेएस को सफलतापूर्वक वैश्विक नामस्थान में लोड करने का कारण बनने की उम्मीद करेगा।आईपीथॉन नोटबुक के भीतर राफेल को कैसे लोड किया जा सकता है, requ.js के कारण उत्पन्न होने वाले कुछ मुद्दों से परहेज करना?

from IPython.display import Javascript 

raphael_url = "https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js" 
Javascript('alert(Raphael);', lib=[raphael_url]) 

हालांकि, यह आईपीथन के हाल के संस्करणों में काम नहीं करता है जो requ.js का उपयोग करता है। बाहर निकलता है, Raphael.js, जो IPython jQuery.getScript() का उपयोग करके लोड करता है, requ.js की उपस्थिति को पहचानता है और जैसे कि वह खुद को वैश्विक नेमस्पेस में नहीं डालता है। वास्तव में, यदि कोई व्यक्ति window.define ऑब्जेक्ट को हटाते हुए जावास्क्रिप्ट कोड चलाता है, तो राफेल अब आवश्यक नहीं है। जेएस मौजूद है, और यह खुद को वैश्विक नेमस्पेस में शामिल करता है जैसा मैं चाहूंगा। दूसरे शब्दों में, कोड ऊपर निम्नलिखित चलाने के बाद काम करता है:

Javascript('window.define = undefined;') 

इस प्रकार, एक ही रास्ता मैं राफेल IPython नोटबुक का नवीनतम संस्करण के भीतर लोड करने के लिए प्राप्त करने में सक्षम हूँ नष्ट करने के लिए है (या अलग सेट) window.define

समस्या की पहचान करने के बाद, मुझे यह जानने के लिए आवश्यक नहीं है कि सॉफ्टवेयर का कौन सा टुकड़ा प्रोटोकॉल के खिलाफ काम कर रहा है। क्या राफेल requ.js के अस्तित्व के परीक्षण के खराब तरीके का उपयोग कर रहा है? क्या IPython उपयोगकर्ता द्वारा प्रदान की गई जावास्क्रिप्ट पुस्तकालयों को लोड करते समय सीधे jQuery.getScript() के बजाय require.js का उपयोग कर रहे हैं? या क्या कोई तरीका है क्योंकि उपयोगकर्ता को requ.js को गले लगाने की ज़रूरत है, जो मुझे किसी विशेष हैक्स की आवश्यकता के बिना Raphael ऑब्जेक्ट देगी? (यदि अंतिम प्रश्न का उत्तर हाँ है, तो क्या कोई तरीका है कि मैं आईपीथॉन नोटबुक के पुराने संस्करणों का भी समर्थन कर सकता हूं, जो requ.js का उपयोग नहीं करते हैं?)

उत्तर

4

मेरे उत्तर का पहला भाग आपको खुश नहीं करेगा, लेकिन IPython-notebook-webapp में जावास्क्रिप्ट लाइब्रेरी की लोडिंग और आवश्यकता को अभी तक हल नहीं किया गया है, इसलिए अब मैं इस बात पर विचार करने के लिए सुझाव दूंगा कि आप इस तरह की लाइब्रेरी लोड कर सकते हैं, और custom.js पर अधिक भरोसा कर सकते हैं अभी व।

कहा जा रहा है कि यदि वैश्विक नामस्थान में राफेल नहीं है तो इसे कैश करने के लिए पर्याप्त स्मार्ट है, और आपको इसका संदर्भ देता है। तो कॉलबैक में आप सिर्फ एक वैश्विक करने के लिए प्रदान कर सकते हैं:

की आवश्यकता होती है ([ 'राफेल'], समारोह (Raph) { window.raphael = Raph; })

या कुछ की तरह है कि क्या करना चाहिए छल।

+0

असल में, '$ .getScript()' के माध्यम से raphael.js को लोड करने के लिए भी 'संदर्भ त्रुटि: पूर्व परिभाषित नहीं किया गया है'। ऐसा लगता है कि राफेल वैश्विक नामस्थान में 'पूर्व संध्या' होने की उम्मीद कर रहे हैं, लेकिन यदि आवश्यक हो तो यह पूर्व संध्या (जिसे राफेल.जेएस का भी हिस्सा है) द्वारा रखा नहीं जाता है। –

+0

तब मेरे पास कोई सुराग नहीं है। क्या यह शब्द 'आवश्यकता' वाले पृष्ठ में मैन्युअल रूप से लोड किया गया है? यदि ऐसा है तो जेएस का एक स्निपेट प्रकाशित करें जो इसे 'lib = 'kw का उपयोग करने के बजाय करता है। – Matt

+0

मैंने 'आवश्यकता' के साथ लोड करने का प्रयास किया है, लेकिन कोई भाग्य नहीं है। वर्तमान आदेश जो मैं उपयोग कर रहा हूं (एक पंक्ति पर) 'जावास्क्रिप्ट ("require.config ({पथ: {राफेल:' https://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min है .js '}}); की आवश्यकता है ([' राफेल '], फ़ंक्शन (रैफ) {window.Raphael = raph;}); ")' –

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