2012-02-23 6 views
5

मैं पता लगाने के लिए कोशिश कर रहा हूँ कि क्या वर्तमान जावास्क्रिप्ट फ़ाइल है कि निष्पादित किया जा रहा है तुल्यकालिक शामिल किया गया है (एक नियमित रूप से स्क्रिप्ट टैग के माध्यम से)पता लगाने के लिए कैसे है कि क्या आपकी जावास्क्रिप्ट तुल्यकालिक या असमकालिक शामिल किया जा रहा है

<script src="myscript.js"></script> 

या असमकालिक एक डालने के माध्यम से डोम में स्क्रिप्ट तत्व प्रोग्राम के,

var script = document.createElement('script') 
script.src = 'myscript.js' 
document.body.appendChild(script) 

और फलस्वरूप कि क्या document.write की तरह कुछ या इस्तेमाल किया जा सकता नहीं। मैंने एक पागल समाधान निकाला है जो परीक्षण करता है कि document.write काम करता है, this gist देखें।

असल में, यह तत्व लिखने के लिए document.write का उपयोग करके काम करता है - मैंने एक खाली स्क्रिप्ट टैग चुना है। फिर यह डीओएम से यह निर्धारित करने के लिए पूछता है कि क्या स्क्रिप्ट तत्व सफलतापूर्वक लिखा गया था। यदि यह था - स्क्रिप्ट को समकालिक रूप से शामिल किया जाना चाहिए, यदि यह नहीं था - इसे असीमित रूप से शामिल किया गया था।

यह समाधान ओपेरा को छोड़कर अब तक परीक्षण किए गए सभी ब्राउज़रों (आईई 7 + सहित सभी प्रमुख) में काम करता है।

सवाल यह है: क्या कोई बेहतर समाधान है?

नोट: मैंने document.readyState की जांच करने का भी प्रयास किया है, लेकिन यह IE में सहायक नहीं प्रतीत होता है।

यह भी ध्यान दें: मुझे एक व्याख्यान की आवश्यकता नहीं है कि document.write बुरा है। मुझे पता है।

अद्यतन: कि इसके अलावा में ओपेरा पर काम नहीं करने के लिए पता चला है, मेरी तकनीक भी IE और अन्य ब्राउज़रों में कुछ मामलों में अविश्वसनीय है - document.write या समय या कैशिंग परिदृश्य के आधार पर काम नहीं हो सकता है। spec उतना ही कहता है।

+2

क्या आप वाकई व्याख्यान की आवश्यकता नहीं है ??? मैं आपको एक देने के लिए तैयार था ...: पी – Domenic

उत्तर

1

यह बुरा है लेकिन आप दस्तावेज़ कार्यों को फिर से परिभाषित कर सकते हैं और अपना खुद का लिख ​​सकते हैं। यह शायद की तरह कुछ:

var oldAppendChild = document.body.appendChild; 

document.body.appendChild = function(child) { 
    //examine if child is a script element, do stuff with it if it is 
    //finally do what the original function did and: 
    oldAppendChild(child); 
} 
निश्चित रूप से

आप सभी अलग ब्राउज़र quirks और और सभी अलग अलग तरीकों से एक पृष्ठ पर एक स्क्रिप्ट तत्व जोड़ सकता है संभाल करने के लिए की आवश्यकता होगी, लेकिन यह क्या आप

का वर्णन करने के लिए एक विकल्प है
+0

मुझे यकीन नहीं है कि यह कैसे पता लगाता है कि स्क्रिप्ट को कैसे शामिल किया गया था। – airportyh

+1

आह ऐसा लगता है कि मैंने गलत समझा। आप * निष्पादन * स्क्रिप्ट को यह जानना चाहते हैं कि * स्वयं * कैसे शामिल किया गया था? –

+0

हां, यह बिल्कुल ठीक है। – airportyh

1

यदि आपके पास सभी तरफ से पूर्ण नियंत्रण है, तो आप जेएस और क्वेरी पैरामीटर के लिए एक गतिशील सर्वर पेज का उपयोग यूआरएल के लिए आवश्यक कर सकते हैं और उसके बाद स्क्रिप्ट के अंदर एक चर सेट करने के लिए इसका उपयोग कर सकते हैं।

var script = document.createElement('script'); 
script.src = 'myscript.php?type=asynch'; 
document.body.appendChild(script); 

जाँच स्क्रिप्ट तत्व की "src" विशेषता के आधार यह सब क्लाइंट साइड करने के लिए संभव हो सकता है, लेकिन मैं उस पर सकारात्मक नहीं हूँ।

+0

यूप जो काम कर सकता है। आपको स्क्रिप्ट को सभी स्क्रिप्ट तत्वों के माध्यम से पार करने और मिलान खोजने के लिए URL द्वारा मिलान करने की आवश्यकता होगी। मुझे आशा है कि इस मार्ग पर जाना न पड़ेगा। – airportyh

+0

यदि मेरा उत्तर उपयोगी या सही था, तो कृपया इसे स्वीकार करें ताकि मुझे अंक से सम्मानित किया जा सके। आप उत्तर के बगल में प्रदर्शित चेक मार्क पर क्लिक करके स्वीकार करते हैं। –

0

ठीक है, यहां एक त्वरित और गंदा समाधान है। हम मानते हैं कि यदि DOMContentLoaded ईवेंट निकाल दिया गया है, तो सभी स्क्रिप्ट सहित संपूर्ण दस्तावेज़ लोड किया गया है। यदि आपकी स्क्रिप्ट उस से पहले निष्पादित की जाती है, तो इसे आपकी परिभाषा के अनुसार 'synchroneously' को निष्पादित किया गया है। यदि इसे बाद में निष्पादित किया जाता है, तो इसे किसी अन्य तरीके से लोड किया जाना चाहिए ('asynchroneously')।

फिर से, त्वरित और गंदे: अपनी HTML फ़ाइल में अपने सिर में एक स्क्रिप्ट टैग बनाएं; क्रॉस-ब्राउज़र संगत होने के लिए, मेरा मानना ​​है कि इसे आपकी HTML फ़ाइल में पहला स्क्रिप्ट टैग होना चाहिए (नोट: विंडो। आधुनिक ब्राउज़र में अपरिभाषित होने पर पहले से ही गलत है)।

<script> 
// this property by default is false 
window.DOMready = false; 

// all browsers but IE<8 
// wait for the DOMContentLoaded event and set window.DOMready to true 
if (document.addEventListener) { 
    document.addEventListener("DOMContentLoaded", function() { 
     window.DOMready = true; 
    }, false); 

} else { 
    // not entirely accurate but functioning in IE<8 
    // you may want to use another IE solution if you care 
    window.onload = function() { 
     window.DOMready = true; 
    } 
} 
</script> 

फिर, अपनी स्क्रिप्ट फ़ाइलों में आप विंडो की जांच कर सकते हैं। पहले से ही संपत्ति। यदि सही है, तो आपकी स्क्रिप्ट को असीमित रूप से लोड किया गया है। उदाहरण:

// myscript.js 
if (window.DOMready) { 
    // we have been loaded asynchroneously 
} else { 
    // we have been loaded synchroneously 
} 

आनंद लें!

+0

यह वास्तव में काम नहीं करेगा क्योंकि एसिंक स्क्रिप्ट डोमेन से पहले लोडिंग को बहुत अच्छी तरह खत्म कर सकती है, उदाहरण के लिए, पृष्ठ के निचले हिस्से में धीमी-लोडिंग स्क्रिप्ट है। – airportyh

+0

स्क्रिप्ट किसी भी समय निष्पादित कर सकती है - आप आम तौर पर एक सहायक लाइब्रेरी जैसे jquery का उपयोग करके डोम तैयार करने की प्रतीक्षा करते हैं ताकि आप सुनिश्चित कर सकें कि आपका लक्षित तत्व वास्तव में डोम में है। –

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

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