वास्तविक उत्तर यह है: क्योंकि आप डेफर पर भरोसा नहीं कर सकते।
अवधारणा में, defer और async इस प्रकार भिन्न होते हैं:
async स्क्रिप्ट को ब्लॉक किए बिना पृष्ठभूमि में डाउनलोड करने की अनुमति देता है। फिर, जिस क्षण इसे डाउनलोड करना समाप्त होता है, रेंडरिंग अवरुद्ध हो जाती है और वह स्क्रिप्ट निष्पादित हो जाती है। स्क्रिप्ट निष्पादित होने पर रेंडर फिर से शुरू होता है।
आस्थगित वही काम करता है, जो यह गारंटी देने के दावों के अलावा करता है कि स्क्रिप्ट उस क्रम में निष्पादित होती हैं जो वे पृष्ठ पर निर्दिष्ट किए गए थे, और दस्तावेज़ निष्पादित करने के बाद उन्हें निष्पादित किया जाएगा। इसलिए, कुछ स्क्रिप्ट डाउनलोड करना समाप्त कर सकते हैं और बाद में डाउनलोड की जाने वाली स्क्रिप्ट की प्रतीक्षा करें और उनके सामने प्रस्तुत हुए।
दुर्भाग्य से, वास्तव में एक मानक बिल्ली की लड़ाई के कारण, डेफर की परिभाषा कल्पना करने के लिए अलग-अलग होती है, और यहां तक कि सबसे हाल के चश्मे में एक उपयोगी गारंटी नहीं मिलती है। यहाँ उत्तर के रूप में और इस मुद्दे को प्रदर्शित करता है, ब्राउज़र अलग तरीके से लागू होते हैं:
- कुछ स्थितियों में कुछ ब्राउज़रों में एक बग होता है जो
defer
स्क्रिप्ट को क्रम से बाहर चलाने का कारण बनता है ।
- स्क्रिप्ट के लोड
DOMContentLoaded
होने के बाद तक कुछ ब्राउज़र इवेंट में देरी करते हैं defer
, और कुछ नहीं करते हैं।
- कुछ ब्राउज़र इनलाइन कोड वाले तत्वों
defer
पर <script>
एक src
विशेषता के बिना पालन करते हैं , और कुछ इसे अनदेखा करते हैं।
सौभाग्य से ऐनक कम से कम यह निर्दिष्ट करता है कि एसिंक्स डीफर को ओवरराइड करता है। तो आप सभी लिपियों को एसिंक्स के रूप में मान सकते हैं और ब्राउज़र समर्थन की एक विस्तृत स्वाथ प्राप्त कर सकते हैं:
<script defer async src="..."></script>
दुनिया भर में उपयोग करने वाले 98% ब्राउज़र और यूएस में 99% इस दृष्टिकोण के साथ अवरुद्ध होने से बचेंगे।
(यदि आपको दस्तावेज़ को समाप्त करने तक प्रतीक्षा करने की आवश्यकता है, तो ईवेंट DOMContentLoaded
ईवेंट को सुनें या jQuery के आसान .ready()
फ़ंक्शन का उपयोग करें । आप वैसे भी ब्राउज़रों पर पीछे हटने के लिए ऐसा करना चाहते हैं जो बिल्कुल भी लागू नहीं होते हैं defer
।)