2010-03-20 12 views
8

मैं window.onload और document.onload घटनाओं के साथ परेशानी हो रही हूँ। जो कुछ भी मैंने पढ़ा है, वह मुझे बताता है कि जब तक डोम अपने सभी संसाधनों से पूरी तरह से लोड नहीं हो जाता है, ऐसा लगता है कि यह मेरे लिए नहीं हो रहा है:window.onload से पहले डोम भरी हुई है को गति प्रदान करने लगता है (जावास्क्रिप्ट)

मैंने क्रोम 4.1.249.1036 (41514) में निम्नलिखित सरल पृष्ठ को आजमाया और आईई 8.0.7600.16385 एक ही परिणाम के साथ: दोनों ने "यह असफल रहा" संदेश प्रदर्शित किया, यह दर्शाता है कि मेरा पैराग्राफ लोड नहीं हुआ है (और इसलिए डोम अधूरा लगता है)।

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
    <head> 
     <script type="text/javascript"> 
      window.onload = doThis(); 
      // document.onload gives the same result 

      function doThis() { 
       if (document.getElementById("myParagraph")) { 
        alert("It worked!"); 
       } else { 
        alert("It failed!"); 
       } 
      } 
     </script> 
    </head> 

    <body> 
     <p id="myParagraph">Nothing is here.</p> 
    </body> 
</html> 

मैं बाहरी .js फ़ाइल में इसकी तुलना में अधिक जटिल स्क्रिप्ट का उपयोग कर रहा हूं, लेकिन यह समस्या को दर्शाता है। मैं वह window.onload के लिए टाइमर सेट होने से काम कर प्राप्त कर सकते हैं आधे सेकंड doThis() को चलाने के लिए, लेकिन यह एक असजीला समाधान की तरह लगता है, और क्यों window.onload क्या करना है नहीं लगता है इस सवाल का जवाब नहीं है हर कोई कहता है कि यह करता है। एक अन्य समाधान एक टाइमर है कि अगर डोम भरी हुई है की जाँच करेगा स्थापित करने के लिए किया जाएगा, और यदि नहीं यह सिर्फ खुद आधे सेकंड बाद में फोन करेंगे (इसलिए यह जब तक डोम भरी हुई है जाँच रखेंगे), लेकिन यह मेरे लिए बहुत जटिल लगता है। क्या उपयोग करने के लिए कोई और उचित घटना है?

+1

पहले गलती है कि मुझे लगता है कि आप [समारोह परिणाम] के बजाय [समारोह] ही assing है मत करो।क्या आप देख सकते हैं 'doThis()' एक ऐसा बयान है जो मूल्यांकन के बाद अपरिभाषित लौटाता है क्योंकि 'doThis' में' वापसी 'ऑपरेटर नहीं है। 'window.onload = doThis; 'नौकरी करेगा। ध्यान दें कि – Dan

+2

@ डेविड मैसन डब्ल्यू 3 स्कूल्स कोई जानकारी नहीं है। वे किसी भी तरह से डब्ल्यू 3 सी से संबद्ध नहीं हैं। * मत *, जानकारी का एक आधिकारिक स्रोत के रूप w3schools इलाज के लिए उन्हें जिस तरह से वे व्यवहार पाने के पात्र का इलाज: उपद्रव लिंक आप पर छोड़ जब आप एक असली संदर्भ वेबसाइट के लिए खोज है। – doug65536

+1

@ doug65536 वर्तमान में मैं पूरी तरह से सहमत हूं। मैं किसी भी व्यक्ति के लिए w3fools.com की अनुशंसा करता हूं जो अनिश्चित है। मैं उच्च गुणवत्ता की जानकारी इन दिनों के लिए developer.mozilla.org के लिए सीधे जाने के लिए करते हैं, तो एक और अधिक व्यापक खोज करते हैं, तो मुझे लगता है मैं वहाँ के लिए क्या देख रहा हूँ (जो आम तौर पर जब मैं कुछ हास्यास्पद करने के लिए कोशिश कर रहा हूँ नहीं मिल रहा है)। मैं बहुत शर्मिंदा हूं कि पिछले-मैंने पोस्ट किया था ... लेकिन मैं इसे हटा सकता हूं! वहां, इंटरनेट पर w3schools के लिए एक कम बेवकूफ संदर्भ :) इसे खोजने के लिए धन्यवाद। –

उत्तर

8

समय खिड़की पर लोड किया जाता है शरीर अभी भी लोड नहीं है इसलिए आप निम्नलिखित तरीके से अपने कोड ठीक हो जानी चाहिए:

<script type="text/javascript"> 
    window.onload = function(){ 
     window.document.body.onload = doThis; // note removed parentheses 
    }; 

    function doThis() { 
     if (document.getElementById("myParagraph")) { 
      alert("It worked!"); 
     } else { 
      alert("It failed!"); 
     } 
    } 
</script> 

परीक्षण एफएफ में काम करने के लिए/आईई/क्रोम, हालांकि document.onload को संभालने के बारे में भी सोच रहा है।

जैसा कि पहले ही उल्लेख किया है, का उपयोग कर js-व्यवस्थाएं कहीं ज्यादा बेहतर विचार होगा।

+0

धन्यवाद, मेरी समस्या हल करने के लिए लग रहे है, और हल करती है मैं क्या सोचा जानते हुए भी अगर शरीर को सफलतापूर्वक लोड किया गया है से पहले body.onload घटना के लिए कुछ संलग्न की एक ही समस्या का एक प्रत्यावर्तन था। अब मेरे पास संदेश है "यह काम किया!" पॉप अप, और मेरी स्क्रिप्ट और मार्कअप को अच्छी और अलग रखने के लिए पैडेंटिक रूप से जारी रख सकते हैं। –

+0

मेरे लिए भी काम किया, धन्यवाद दोस्त! – foxybagga

+0

ध्यान दें कि 2 स्क्रिप्ट के लिए इस दृष्टिकोण का उपयोग करने से शायद एक दूसरे के साथ ओवरराइट हो जाएगा। इन दिनों मैं दस्तावेज़ का उपयोग करता हूं .addEventListener ("DOMContentLoaded", फ़ंक्शन (ईवेंट) { console.log ("डोम पूरी तरह से लोड और पार्स किया गया"); }); देखें: https://developer.mozilla.org/en-US/docs/Web/Reference/Events/DOMContentLoaded –

1

आप के बजाय एक JavaScript लाइब्रेरी का उपयोग करें, जैसे की कोशिश की है jQuery और यह $(document).ready() समारोह है:

$(document).ready(function() { 
     // put all your jQuery goodness in here. 
    }); 
+1

धन्यवाद, मैं इस सप्ताह इसे देख लूंगा। मुझे अभी भी चिंता है कि डीओएम से जुड़े किसी भी घटना को प्रतीत नहीं होता है जो तीसरे पक्ष की स्क्रिप्ट का उपयोग किए बिना, डोम लोड होने पर विश्वसनीय रूप से मुझे बता सकता है। –

+1

यह इस के लिए केवल लाइब्रेरी में जोड़ने के लिए निश्चित रूप से overkill है - पुस्तकालय डाउनलोड प्रतीक्षा अवधि और डेटा स्थानांतरण कहते हैं और शायद ही आप कुछ वर्ण बचाता है। jQuery विशेष रूप से हेवीवेट है। कहा करने के बाद कि, वहाँ शायद इसे प्रयोग डोम के लिए तैयार घटना के लिए एक समारोह संलग्न संभाल करने में कम या कोई नुकसान है कि अगर आप पहले से ही अन्य बातों के लिए एक पुस्तकालय का उपयोग कर रहे हैं। –

+0

@ डेविड मेसन मैं पूरी तरह से सहमत हूं। अधिकांश मामलों, मैं jQuery दोगुना हो जाता है पृष्ठ लोड समय .. यदि आप jQuery लोड (या किसी अन्य लोकप्रिय जावास्क्रिप्ट पुस्तकालय) एक CDN से, तो संभावना है कि बड़ा आपके ब्राउज़र पहले से ही अपने कैश में js फ़ाइलों है कि कर रहे हैं (दौरों से पाया है –

9

बस का उपयोग window.onload = doThis;window.onload = doThis(); के बजाय

+0

अधिक जानकारी के लिए, यह क्यों देखें: http://stackoverflow.com/questions/8830074/what- विंडो-ऑनलोड-इनिट-एंड-विंडो-ऑनलोड-इनिट – Cymbals

1

यह निर्भर करता है जहाँ आप ऑनलोड समारोह डाल (सिर या शरीर टैग या नीचे और आगे), आंतरिक घटना seeemingly बाध्यकारी विभिन्न ब्राउज़रों में थोड़ा अलग है।

भी देखें window.onload vs document.onload

7

यह समझना महत्वपूर्ण है कि () एक ऑपरेटर, बस + या && की तरह है महत्वपूर्ण है। () कोई फ़ंक्शन लेता है और उसे कॉल करता है।

तो उस स्थिति में, doThis एक फ़ंक्शन ऑब्जेक्ट है, और () वह ऑपरेटर है जो फ़ंक्शन को कॉल करता है। doThis() संयुक्त एक साथ doThis कहता है, वह निष्पादित और मूल रूप से window.onload

और इस तरह के doThis की वापसी मान निर्दिष्ट है doThis

तो window.onload = doThis() के रिटर्न मान पर मूल्यांकन करता है, कि ठीक करने के लिए, आप संदर्भ के लिए की जरूरत है खुद को कार्य करें, इसे कॉल न करें।

window.onload = doThis

+2

के बीच-अलग-अलग है यह उत्तर होना चाहिए। –

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