2012-02-26 20 views
28

मैं लाइब्रेरी विकसित करने में सहायता करने की कोशिश कर रहा हूं और इसके लिए मैं पेज लोडिंग के साथ काम करने की कोशिश कर रहा हूं।
प्रक्रिया में मैं पुस्तकालय को डिफर और एसिंक के उपयोग से पूरी तरह संगत बनाना चाहता हूं।यह पता लगाने के लिए कि क्या DOMContentLoaded को निकाल दिया गया था

मुझे जो चाहिए वह सरल है:
मुझे कैसे पता चलेगा कि फ़ाइल को निष्पादित किए जाने के दौरान DOMContentLoaded निकाल दिया गया था?

यह इतना मुश्किल क्यों है?
आईई में, document.readyState DOMContentLoaded से पहले इंटरैक्टिव दिखाएं।
I किसी भी तरह से ब्राउज़र का पता लगाने का उपयोग नहीं करेगा, यह मेरे और बाकी प्रतिभागियों की नीति के खिलाफ है।

सही विकल्प क्या है?

संपादित करें:

ऐसा लगता है कि मैं पर्याप्त स्पष्ट नहीं था। मैं नहीं जानना चाहता हूं कि लोड ईवेंट पहले से ही हुआ है !!! मुझे पहले से ही पता था कि उस समस्या को कैसे हल किया जाए! मैं जानना चाहता हूं कि DOMContentLoaded के साथ कैसे हल करें !!!

+0

एक श्रोता सेट करें जो एक संपत्ति या चर सेट करता है। यदि यह सेट है, तो ईवेंट भेज दिया गया है। बेशक आप ऐसे ब्राउज़र में हो सकते हैं जो घटना का समर्थन नहीं करता है, इस मामले में यह कभी नहीं होगा। – RobG

+0

@RobG मुझे पहले से ही उन ब्राउज़र के लिए जवाब था जो एडीओ DOMContentLoaded का समर्थन नहीं करते हैं। उन लोगों के लिए, मैं लोड इवेंट और ऑनलोड इवेंट का उपयोग करता हूं। मेरे पास अभी भी – brunoais

+0

के प्रश्न का उत्तर नहीं है, "लोड * ईवेंट के लिए श्रोताओं को सेट करने के लिए कोई * ऑनलोड * विशेषता/संपत्ति नहीं है। यदि आप स्पष्ट रूप से जानना चाहते हैं कि DOMContentLoaded हुआ है, तो श्रोता सेट करें और देखें कि इसे कहलाया गया है या नहीं। – RobG

उत्तर

29

मैं तुम्हें इस्तेमाल कर सकते हैं लगता होगा:

if (document.readyState === "complete" || document.readyState === "loaded") { 
    // document is already ready to go 
} 

यह एक लंबे समय के लिए वेबकिट IE में समर्थन किया और किया गया है। इसे 3.6 में फ़ायरफ़ॉक्स में जोड़ा गया था। यहां spec है। "loaded" पुराने सफारी ब्राउज़रों के लिए है।

आप को पता है जब पेज पार्स किया गया है चाहते हैं, लेकिन सभी subresources अभी तक लोड नहीं किया गया है, तो आप "इंटरेक्टिव" मूल्य जोड़ सकते हैं:

if (document.readyState === "complete" 
    || document.readyState === "loaded" 
    || document.readyState === "interactive") { 
    // document has at least been parsed 
} 

इसके पार, आप वास्तव में सिर्फ करना चाहते हैं पता करें कि DOMContentLoaded को निकाल दिया गया है, तो आपको इसके लिए एक ईवेंट हैंडलर इंस्टॉल करना होगा (इससे पहले कि यह आग लग जाए) और जब यह आग लग जाए तो ध्वज सेट करें।

This MDN documentation डीओएम राज्यों के बारे में अधिक समझने के बारे में भी वास्तव में एक अच्छा पढ़ा है।

+0

आप इस सवाल का जवाब नहीं दे रहे हैं। मैं DOMContentLoaded ईवेंट के बारे में जानना चाहता हूं, ईवेंट लोड नहीं करता हूं। लोड इवेंट आसान है, DOMContentLoaded मुझे नहीं पता। – brunoais

+1

@brunoais - फिर DOMContentLoaded ईवेंट के लिए हैंडलर इंस्टॉल करें और जब यह आग लगती है तो ध्वज सेट करें। मुझे नहीं लगता कि एक और विकल्प है। – jfriend00

+1

यदि आप दस्तावेज़ को पार्स किए जाने पर शामिल करना चाहते हैं, लेकिन उप-संसाधन अभी भी लोड हो रहे हैं, तो आप भी "इंटरैक्टिव" की जांच कर सकते हैं। मेरे उत्तर में जोड़ा गया दूसरा उदाहरण देखें। – jfriend00

1

इस प्रयास करें या कम से इस link

<script> 
    function addListener(obj, eventName, listener) { //function to add event 
     if (obj.addEventListener) { 
      obj.addEventListener(eventName, listener, false); 
     } else { 
      obj.attachEvent("on" + eventName, listener); 
     } 
    } 

    addListener(document, "DOMContentLoaded", finishedDCL); //add event DOMContentLoaded 

    function finishedDCL() { 
     alert("Now DOMContentLoaded is complete!"); 
    } 
</script> 

नोट

देखो तुम एक <link rel="stylesheet" ...>

पेज के बाद एक <script> पार्स प्रक्रिया पूरी नहीं होगी है - और DOMContentLoaded सक्रिय नहीं होगा - स्टाइलशीट लोड होने तक

+1

अच्छा प्रयास करें लेकिन यह वास्तव में बाद में नहीं है के बाद नहीं जाता है। यह जांच नहीं करता है कि घटना को पहले ही निकाल दिया गया था, केवल यह जांचता है कि घटना को निकाल दिया जा रहा है या नहीं। मुझे पता है कि घटना को निकाल दिया जा रहा है या नहीं, लेकिन मुझे नहीं पता कि यह जांच कैसे की जा सकती है कि घटना को पहले ही निकाल दिया गया है – brunoais

0

आप "वास्तव में" अगर DOMContentLoaded निकाल दिया गया था, तो आप इस तरह एक बूलियन ध्वज इस्तेमाल कर सकते हैं जानना चाहते हैं:

var loaded=false; 
document.addEventListener('DOMContentLoaded',function(){ 
loaded=true; 
... 
} 

तो साथ जांच: जब इस घटना के सक्रिय होने पर

if(loaded) ... 
+0

अच्छा प्रयास करें :)। हालांकि, यह वास्तव में एक जवाब नहीं है। जैसा कि मैं चाहता हूं कि यह सभी (प्रमुख) ब्राउज़र और एसिंक और डिफर के साथ सही तरीके से काम करे, मैं इतना सुनिश्चित नहीं हो सकता कि यह आईई के कारण अपेक्षित काम करेगा। – brunoais

+0

आईई ब्राउज़र नहीं है: डी – deviato

+0

हम चाहते हैं <_ <... – brunoais

8

document.readyState बदल गया है । तो आप readyState मान देख सकते हैं और इस तरह से बताएं कि ईवेंट को निकाल दिया गया था या नहीं।

if (/comp|inter|loaded/.test(document.readyState)){ 
    // In case DOMContentLoaded was already fired, the document readyState will be one of "complete" or "interactive" or (nonstandard) "loaded". 
    // The regexp above looks for all three states. A more readable regexp would be /complete|interactive|loaded/ 
    start(); 
}else{ 
    // In case DOMContentLoaded was not yet fired, use it to run the "start" function when document is read for it. 
    document.addEventListener('DOMContentLoaded', start, false); 
} 
+0

बताएं कि यह कैसे काम करता है – brunoais

+0

@brunoais एनपी, मैंने टिप्पणियों के रूप में स्पष्टीकरण जोड़ा है, क्या यह अब स्पष्ट है? – oriadam

+0

तो ... मूल रूप से आपने दोस्त के जवाब को चुना और अपने उत्तर से डेटा के साथ एक उत्तर बनाया? – brunoais

-3

यहाँ, बात है अगर कुछ अन्य पुस्तकालय (जैसे jQuery के रूप में) पहले से ही DOMContentLoaded इस्तेमाल किया, आप इसे फिर से उपयोग नहीं कर सकते: यहाँ start() को चलाने के लिए जब दस्तावेज़ इसके लिए तैयार है एक कोड है। यह बुरी खबर हो सकती है, क्योंकि आप इसका उपयोग करने में सक्षम होने के बिना खत्म हो जाते हैं। आप कहने वाले हैं, क्यों न केवल $(document).ready() का उपयोग करें, क्योंकि, नहीं !, सबकुछ jQuery का उपयोग करने की ज़रूरत नहीं है, विशेष रूप से यदि यह एक अलग पुस्तकालय है।

+1

यह सच नहीं है कि आपके पास एकाधिक ईवेंट श्रोताओं नहीं हो सकते हैं। कृपया https://developer.mozilla.org/en-US/docs/DOM/document.addEventListener और प्रकाशित/सदस्यता लें (पब उप) पैटर्न पर पढ़ें: https://msdn.microsoft.com/en-us/ पुस्तकालय/ff649664.aspx – dotnetCarpenter

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