2012-06-04 12 views
6

हमारे पास एक ब्राउज़र विस्तारक ब्राउज़र (बीएचओ) के रूप में लागू एक आईई एक्सटेंशन है। हमारे पास सी ++ में लिखा गया एक उपयोगिता फ़ंक्शन है जिसे हम पृष्ठ की विंडो ऑब्जेक्ट में जोड़ते हैं ताकि पृष्ठ में अन्य स्क्रिप्ट स्थानीय स्क्रिप्ट फ़ाइलों को गतिशील रूप से लोड करने के लिए इसका उपयोग कर सकें।मैं जावास्क्रिप्ट के साथ वर्तमान में चल रही स्क्रिप्ट का मार्ग कैसे प्राप्त करूं?

  • myfunc() सी में लिखे ++ और पेज का JavaScript
  • फ़ाइल के संपर्क में: इन स्थानीय स्क्रिप्ट फ़ाइलें करने के लिए संबंधित पथ को हल करने में, हालांकि, हम अपने फ़ंक्शन को कॉल जावास्क्रिप्ट फ़ाइल का रास्ता निर्धारित करने के लिए की जरूरत है: ///path/to/some/javascript.js
  • (अतिरिक्त ढेर फ्रेम)

शीर्ष फ्रेम मैं जानकारी है कि स्क्रिप्ट myfunc() बुला फ़ाइल में स्थित है प्राप्त करना चाहते हैं से: /// पथ /to/some/javascript.js।

मुझे पहले उम्मीद थी कि हम आसानी से IActiveScriptDebug इंटरफ़ेस का उपयोग हमारे उपयोगिता फ़ंक्शन से स्टैकट्रैक प्राप्त करने के लिए कर सकते हैं। हालांकि, इंटरफ़ेस या संबंधित दस्तावेज़ से IActiveScript इंटरफ़ेस प्राप्त करना असंभव प्रतीत होता है (Full callstack for multiple frames JS on IE8 देखें)।

एकमात्र चीज जिसे मैं सोच सकता हूं वह है कि हम अपनी स्क्रिप्ट डीबगर कार्यान्वयन पंजीकृत करें औरडीबगर में तोड़ दें। हालांकि, मुझे संदेह है कि यह उपयोगकर्ता को यह बताए बिना काम करेगा कि वे डीबगर में तोड़ना चाहते हैं या नहीं।

इस दृष्टिकोण के अधिक गहन परीक्षण करने से पहले, मैं यह जांचना चाहता था कि क्या इस बारे में निश्चित जानकारी है कि यह काम करने की संभावना है या/या वैकल्पिक दृष्टिकोण का सुझाव दे सकता है जो एक स्टैक ट्रेस प्राप्त करने के लिए सी ++ में लिखे गए फ़ंक्शन को सक्षम करेगा स्क्रिप्टिंग इंजन से जिसने इसे बुलाया।

उत्तर

0

यह उत्तर वर्णन करता है कि मैंने मूल प्रश्न में वर्णित वास्तविक समस्या को कैसे हल किया। प्रश्न का विवरण बहुत अच्छा नहीं है क्योंकि मैं इस समस्या को हल करने के बारे में धारणा बना रहा था कि वास्तव में निराधार होने के कारण। मैं वास्तव में क्या करने की कोशिश कर रहा था वर्तमान में चल रही स्क्रिप्ट का मार्ग निर्धारित करता है। मैंने सवाल का शीर्षक बदलकर इसे अधिक सटीक रूप से प्रतिबिंबित कर दिया है।

यह वास्तव में हासिल करना काफी आसान है क्योंकि स्क्रिप्ट को HTML दस्तावेज़ में निष्पादित किया जाता है क्योंकि वे लोड होते हैं। इसलिए यदि मैं वर्तमान में script टैग द्वारा लोड की गई कुछ जावास्क्रिप्ट को निष्पादित कर रहा हूं, तो script टैग हमेशा दस्तावेज़ में अंतिम स्क्रिप्ट टैग होगा (क्योंकि शेष दस्तावेज़ अभी तक लोड नहीं हुआ है)। इस समस्या को हल करने के लिए, इसलिए अंतिम स्क्रिप्ट टैग की src विशेषता का URL प्राप्त करने के लिए पर्याप्त है और उस पर आधारित किसी भी सापेक्ष पथ को हल करें।

बेशक यह सीधे HTML पृष्ठ में एम्बेडेड स्क्रिप्ट के लिए काम नहीं करता है, लेकिन यह वैसे भी खराब अभ्यास है (आईएमओ) तो यह एक बहुत ही महत्वपूर्ण सीमा की तरह प्रतीत नहीं होता है।

1

आपके द्वारा लोड की जाने वाली प्रत्येक स्क्रिप्ट में एक आईडी हो सकती है और myfunc() को कॉल करने वाली स्क्रिप्ट की प्रत्येक विधि इस आईडी को myfunc() पर पास कर सकती है। इसका मतलब है कि सबसे पहले आपको myfunct() को संशोधित करना होगा और अंततः अपनी स्क्रिप्ट और कॉल को बदलना होगा।

+0

मुझे और स्पष्ट होना चाहिए था: myfunc() को कॉलर से कोई जानकारी नहीं मिल सकती है जिसका उपयोग पथ निर्धारित करने के लिए किया जा सकता है। (यदि कोई उत्सुक है, तो हम कॉमनजेएस स्पेक के अनुसार आवश्यकता() फ़ंक्शन को कार्यान्वित कर रहे हैं, इसलिए हमें स्पेक कहने के लिए चिपकना होगा।) –

+0

यह बिल्कुल अलग है। सबसे अच्छा आप कर सकते हैं कि वर्तमान कार्यान्वयन पर नज़र डालें और संभवतः एक विचार प्राप्त करें (यदि आपने पहले से नहीं किया है)।एक उदाहरण "स्मार्ट प्लेटफ़ॉर्म" को https://github.com/joyent/smart-platform/blob/master/share/internal_js/require.js –

+0

पर कार्यान्वयन की आवश्यकता होगी, यह कैसे मदद करता है? हमारे पास पहले से ही आईई (सी ++ में लिखा गया है) के लिए आवश्यकता() की कार्यान्वयन है, लेकिन इसके लिए spec के अनुसार काम करने के लिए, इसे जेएस फ़ाइल के पथ को जानने की आवश्यकता है जो इसे आमंत्रित करता है। –