2009-10-03 16 views
7

मुझे लगता है कि यह एक आसान सवाल होना चाहिए लेकिन मैं चारों ओर खोज कर रहा हूं और कहीं भी जवाब नहीं मिला है।जावास्क्रिप्ट फ़ंक्शन निष्पादित किए जाने पर

<script type="text/javascript">grf();</script> 

GRF() समारोह एक बाहरी .js फ़ाइल में परिभाषित किया गया है:

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

+0

फ़ंक्शंस निष्पादित किए जाने के बारे में पहले प्रश्न का उत्तर देने के लिए धन्यवाद । दूसरे प्रश्न के लिए ऐसा लगता है कि आप में से अधिकांश सहमत हैं कि jQuery का उपयोग करने का सबसे अच्छा विकल्प है। हालांकि मैं सोच रहा था कि क्या यह जानना संभव है कि कोई फ़ंक्शन परिभाषित किया गया है या नहीं। उदाहरण के लिए मैं यह सुनिश्चित करने के लिए ऐसा कुछ कर सकता हूं कि एक elem लोड हो गया है: फ़ंक्शन ff() {if (! Document.getElementById ('elem')) setTimeout ('ff()', 250); // यहां से मैं 'elem'} का उपयोग कर सकता हूं लेकिन क्या यह जानने का कोई तरीका है कि कोई फ़ंक्शन परिभाषित किया गया है या नहीं? – Victor

+1

@ victor - परीक्षण का उपयोग: अगर (टाइपफ (फ़ंक्शननाम)! = 'अपरिभाषित') {// फ़ंक्शन मौजूद है} – x0n

+0

यदि किसी भी libs का उपयोग नहीं करते हैं, और आप डीओएम का उपयोग करने वाले कोड को चलाने के लिए चाहते हैं, तो सबसे विश्वसनीय तरीका जोड़ना है आपके द्वारा उपयोग किए जा रहे मतदान तंत्र के बजाय, करीबी बॉडी टैग के बाद आपका स्क्रिप्ट टैग। गैर-jQuery उदाहरण प्रदान करने के लिए –

उत्तर

9

देखने के लिए अगर एक समारोह परिभाषित किया गया है:

// functions are defined or undefined just like regular variables 
function myFunc() { 
    /*--code here--*/ 
} 

// So we just need to see if it's defined 
if(myFunc) { 
    /*--do something here--*/ 
} else { 
    /*--wait, retry or w/e--*/ 
} 

जब एक बाह्य स्क्रिप्ट पाया जाता है, (एक्स) एचटीएमएल आगे तक पढ़ा नहीं जा जाएगा बाहरी स्क्रिप्ट पढ़ने के लिए है (और कोड के अंदर निष्पादित वहाँ किसी भी है कि अगर वहां निष्पादन योग्य कोड)।

तो, बाहरी फ़ाइल के बाद बाहरी फ़ाइल में एक फ़ंक्शन को कॉल करना 'शामिल' था, फ़ंक्शन-परिभाषित त्रुटि उत्पन्न नहीं कर सकता है। (हालांकि, ध्यान रखें कि आपको त्रुटियां मिलेंगी यदि वह बाहरी कार्य पृष्ठ में मौजूद "डीओएम या तत्वों में हेरफेर करने का प्रयास करता है जो अभी भी" मौजूद नहीं हैं।)

+0

+1 - इससे पहले कि मैंने जवाब दिया था। –

+0

'if (myFunc) 'जब myFunc अपरिभाषित है, तो त्रुटि उत्पन्न होगी। 'अगर (myofun ==" अपरिभाषित "टाइप करें) 'नहीं होगा (जैसा कि z0n उल्लेख किया गया है) –

8

विधि को निष्पादित किया जाएगा क्योंकि ब्राउज़र पृष्ठ लोड कर रहा है, जब यह <script> ब्लॉक के अंत तक पहुंचता है। यदि बाहरी जेएस फ़ाइल को इस विधि को कहां से नीचे पृष्ठ में शामिल किया गया है, तो यह एक त्रुटि फेंक देगा (विधि परिभाषित नहीं है)।

आप जब तक पेज और संपत्ति लोड हो जाने तक इंतजार करना चाहते हैं, यह एक पुस्तकालय का उपयोग करने के लिए सबसे अच्छा है। सुझाए गए onload ईवेंट का उपयोग सीमित है, क्योंकि यह केवल एक हैंडलर जोड़ने का समर्थन करता है (एक और जोड़ना पिछले एक को ओवरराइट करेगा)। यहाँ jQuery का उपयोग कर एक उदाहरण है: जब यह का सामना करना पड़ा है

<script type="text/javascript"> 
$(document).ready(function() { 
    //code goes here 
    }); 
</script> 
14

समारोह चलाया जाता है। यदि आप पृष्ठ लोड होने के बाद इसे चलाने के लिए चाहते हैं, तो मानक विधि विंडो के अधिभार ईवेंट को हुक करना है। jQuery इस के लिए महान समर्थन हासिल है, लेकिन जमीनी स्तर के साथ शुरू कर सकते हैं:

<script type="text/javascript">window.onload = function() { grf(); }</script> 

यह किसी अन्य ऑनलोड संचालकों से हो सकता है पेज है, जो पर पहले से सौंपा गया है पर stomp क्यों ज्यादातर लोगों jQuery का उपयोग जो सावधान है पिछले संचालकों को श्रृंखला के लिए:

<script type="text/javascript">$(document).ready(function() { grf(); });</script> 
इस दूसरे उदाहरण के लिए बेशक

, आप jQuery पुस्तकालयों (तरह तुम क्या करने की स्थिति में नहीं हैं कि कौन-यह लग रहा है) पृष्ठ को आगे शामिल करने के लिए की जरूरत है।

+1

+1 –

+0

फ़ंक्शन चलाया जाता है तो उसके * कॉल * ('grf()') का सामना करना पड़ता है। – Gumbo

+0

यह सवाल का उत्तर कैसे देता है? .. – levik

3

जब ब्राउज़र टैग को देखता है तो ब्राउज़र इसे निष्पादित करता है। न केवल अन्य स्क्रिप्ट लोड हो सकती हैं, डोम का निर्माण नहीं किया जा सकता है। हालांकि, यह गारंटी है कि HTML में दिखाई देने के क्रम में स्क्रिप्ट निष्पादित की जाती हैं।

आप jQuery का उपयोग कर सकते हैं, तो यह $ .ready() समारोह, कि कॉलबैक कॉल DOM के तैयार होने और इतने हर स्क्रिप्ट पहले से ही भरी हुई हैं।

$.ready(grf); 

या अज्ञात फ़ंक्शन के साथ इसका उपयोग आमतौर पर किया जाता है।

+0

+1 इस उत्तर को क्यों वोट दिया गया? फ़ंक्शन को सीधे पास करने और इसे एक अतिरिक्त अज्ञात फ़ंक्शन में समाहित करने के लिए बिल्कुल वैध है। – Gumbo

+0

@ गम्बो क्योंकि यह कम स्पष्ट है कि क्या हो रहा है - ओपी शायद जावास्क्रिप्ट के लिए पर्याप्त नया है जैसा कि यह है। – x0n

+0

@gumbo और रिकॉर्ड के लिए, मैं आपसे सहमत हूं कि इसे वोट नहीं दिया जाना चाहिए (मैंने जवाब भी +1 किया) – x0n

0

स्क्रिप्ट के साथ समस्याओं को रोकने के लिए सबसे अच्छा तरीका जावास्क्रिप्ट लाइब्रेरी जैसे jQuery, Mootools आदि का उपयोग करना है जो विभिन्न घटनाओं (dom.ready इत्यादि) को किसी भी कोड को बांधना आसान बनाता है ताकि यह सुनिश्चित किया जा सके कि सबकुछ पहले से लोड हो गया है ।

7

जब तक स्क्रिप्ट फ़ाइल समारोह उपयोग ऊपर शामिल किया गया है, समारोह उपलब्ध हो जाएगा।

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

टैग का सामना करने पर ब्राउज़र प्रतिपादन रोक देगा। जब स्क्रिप्ट डाउनलोड और पार्स किया जाता है तो यह केवल दस्तावेज़ पृष्ठ को संसाधित करेगा।उपलब्ध सही इसलिए किसी भी समारोह लिपि में परिभाषित किया जाएगा के बाद:

<script src="..."></script> <!-- Browser waits until this script is loaded --> 
<script> 
    foo(); // if function foo was in the script above, it is ALWAYS available now 
</script> 

यह वास्तव में हमेशा एक वांछित व्यवहार है - कभी कभी आप एक स्क्रिप्ट के लिए प्रतीक्षा करने के लिए इसे अपने कोड धीमी गति से लग रहे हैं कर सकते हैं के रूप में डाउनलोड करने के लिए नहीं करना चाहते हैं । एक तकनीक यह है कि </body> से पहले सभी स्क्रिप्ट लोड और निष्पादित करें, जब सभी HTML पहले ही प्रस्तुत हो जाएं।

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