window.onload बनाम <body onload = "" />


227

वास्तव में क्या अंतर है window.onloadघटना और onloadकी घटना bodyटैग? मैं कब और किसका उपयोग सही तरीके से करूं?


2
आपको विशेषता मान को घेरने के लिए "का उपयोग करना चाहिए
स्वेन लार्सन

जवाबों:


218

window.onload = myOnloadFuncऔर एक ही घटना<body onload="myOnloadFunc();"> का उपयोग करने के विभिन्न तरीके हैं । उपयोग करना कम अप्रिय है हालांकि - यह आपके जावास्क्रिप्ट को HTML से बाहर ले जाता है।window.onload

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


57
हालांकि, यह ध्यान दिया जाना चाहिए कि अंतर है। इनलाइन ऑनलोड घटना myOnloadFunc()वैश्विक संदर्भ में कॉल करने वाली है ( thisसंदर्भित होगी window)। जावास्क्रिप्ट के माध्यम से इसे स्थापित करने से यह तत्व के संदर्भ में निष्पादित होगा (उस तत्व को thisसंदर्भित करता है जिस पर घटना को चालू किया गया था)। इस विशेष मामले में, इससे कोई फर्क नहीं पड़ेगा, लेकिन यह अन्य तत्वों के साथ होगा।
मोवल्कलर

1
@Walkerneo: हां, निश्चित रूप से ध्यान देने योग्य है। बेशक, जेएस लाइब्रेरी का उपयोग thisकरने से उस ऑब्जेक्ट को ओवरराइड किया जा सकता है जो वांछित होने पर संदर्भित करता है।
रिचर्ड टर्नर

@RichardTurner आपको संदर्भ बाइंडिंग को बदलने के लिए लाइब्रेरी का उपयोग करने की आवश्यकता नहीं है। एक साधारण .bind () कॉल करता है कि
क्लो

@ क्लोकर आप इन दिनों कर सकते हैं, हाँ, लेकिन आपको MSIE9 + की आवश्यकता है। पुराने MSIE पर, जो कि मेरे जवाब देने पर बहुत अधिक सामान्य था, आपको पॉलीफ़िल की आवश्यकता होगी।
रिचर्ड टर्नर

33

कोई अंतर नहीं है, लेकिन आपको उपयोग नहीं करना चाहिए।

कई ब्राउज़रों में, window.onloadघटना को तब तक ट्रिगर नहीं किया जाता है जब तक कि सभी चित्र लोड नहीं हो जाते हैं, जो कि आप चाहते हैं। मानक आधारित ब्राउज़रों में एक घटना होती है जिसे DOMContentLoadedपहले आग कहा जाता है , लेकिन यह IE (इस उत्तर को लिखने के समय) द्वारा समर्थित नहीं है। मैं एक जावास्क्रिप्ट लाइब्रेरी का उपयोग करने की सलाह दूंगा जो क्रॉस ब्राउज़र DOMContentLoaded सुविधा का समर्थन करता है, या एक अच्छी तरह से लिखित फ़ंक्शन ढूंढना जो आप उपयोग कर सकते हैं। jQuery का $(document).ready(), एक अच्छा उदाहरण है।


53
भविष्य से सवाल ... क्या होगा अगर कोई जॉकरी नहीं है?
सिड

54
वर्तमान से प्रश्न .. क्या होगा यदि jQuery हाथ में परियोजना के लिए ओवरकिल है? (दस्तक नहीं jQuery, इसे स्वयं का उपयोग करें। बस कभी-कभी केवल एक पुस्तकालय से बाहर एक सुविधा चाहते हैं ..)
ब्रैडमैज

14
जब आप कहते हैं कि "IE द्वारा समर्थित नहीं है" तो यह एक सार्वभौमिक सत्य है, या केवल IE के विशिष्ट संस्करणों के लिए सच है? जब से आपने यह उत्तर लिखा है, तब से ब्राउज़र की दुनिया में बहुत कुछ बदल गया है, शायद इस उत्तर को अपडेट करने का समय आ गया है?
ब्रायन ओकली

8
DOMContentLoaded को अब IE9 और up: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Adam

6
भविष्य से रिपोर्टिंग, DOMContentLoaded को अब सभी प्रमुख ब्राउज़रों द्वारा समर्थित किया गया है: caniuse.com/#feat=domcontentloaded
Jose Gómez

21

window.onloadशरीर के बिना काम कर सकते हैं। केवल स्क्रिप्ट टैग के साथ पृष्ठ बनाएं और इसे ब्राउज़र में खोलें। पृष्ठ में कोई भी निकाय शामिल नहीं है, लेकिन यह अभी भी काम करता है ..

<script>
  function testSp()
  {
    alert("hit");
  }
  window.onload=testSp;
</script>

6
यदि आप वास्तव में कंटेंट जोड़ते हैं (जो कि बॉडी टैग में होना चाहिए) तो HTML बिना बॉडी टैग के अमान्य है। साथ ही आपका स्क्रिप्ट टैग एक प्रकार से याद आ रहा है। अपने गैर-मानक-अनुरूप कोड को ठीक करने वाले ब्राउज़रों पर कभी भी भरोसा न करें! (। ब्राउज़रों तो अलग तरह से है या नहीं अतीत या भविष्य में सब पर ऐसा कर सकते हैं के रूप में)
Kissaki

4
@Kissaki: मानक एचटीएमएल सब पर एक शरीर टैग की जरूरत नहीं है!
रॉबर्ट सिएमर

5
xhtml1 निर्दिष्ट करता है <!ELEMENT html (head, body)>[1] - और html401 <!ELEMENT HTML O O (%html.content;)के <!ENTITY % html.content "HEAD, BODY">रूप में अच्छी तरह से निर्दिष्ट करता है [२]। html51 A head element followed by a body element.HTML सामग्री के लिए भी बताता है । [३] w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Strict w3.org/TR/xhtml1/dtds.html#a_dtd_XHTML-1.0-Stash w3.org/TR/html51/semantics.html#the -html तत्व - तो मैं उन आम / में उपयोग एचटीएमएल मानकों के सभी लगता है कि ऐसा एक शरीर टैग की आवश्यकता है। :)
Kissaki

1
@Kissaki एक्सएचटीएमएल, नहीं एचटीएमएल है कि। HTML, बॉडी टैग्स की शुरुआत और अंत दोनों के टैग की अनुमति देता है, साथ ही इसके SGML DTD के अनुसार HTML और हेड टैग की भी चूक करता है। w3.org/TR/html401/struct/global.html#edef-BODY Start tag: optional, End tag: optional
OdraEncoded

1
@Kissaki: एचटीएमएल 5 स्क्रिप्ट प्रकार अब और (अगर यह की जावास्क्रिप्ट), आप पहले के संस्करणों के लिए सही जरूरत नहीं है।
मार्क

10

मैं पसंद करता हूं, आम तौर पर, > ईवेंट का उपयोग नहीं करने के लिए <body onload=""। मुझे लगता है कि व्यवहार को यथासंभव सामग्री से अलग रखना क्लीनर है।

उस ने कहा, ऐसे अवसर होते हैं (आमतौर पर मेरे लिए बहुत दुर्लभ) जहां शरीर के भार का उपयोग करने से थोड़ी गति बढ़ सकती है।

मुझे प्रोटोटाइप का उपयोग करना पसंद है इसलिए मैं आमतौर पर <headअपने पेज के > में कुछ इस तरह से डालता हूं:

document.observe("dom:loaded", function(){
  alert('The DOM is loaded!');
});

या

Event.observe(window, 'load', function(){
  alert('Window onload');
});

ऊपर दी गई तरकीबें मैंने यहाँ सीखी हैं । मैं HTML के बाहर अटैच इवेंट हैंडलर्स की अवधारणा का बहुत शौकीन हूं।

(कोड में वर्तनी की गलती को सुधारने के लिए संपादन करें।)


किन अवसरों में यह तेज होगा, और क्यों?
Kissaki

यह उत्तर सभी "मैं" ("मुझे पसंद है", "मुझे लगता है") के साथ बहुत व्यक्तिपरक लगता है। कि अगर आगे किसी भी उद्देश्य और सत्यापन योग्य तथ्यों का अभाव है, तो उस धारणा का बहुत समर्थन करता है।
Kissaki

1
मैं नमक के दाने के साथ इस जवाब पर विचार करूंगा कि यह 6 साल पहले पोस्ट किया गया था। आप इसे अपडेट करने या अपने स्वयं के बेहतर उत्तर पोस्ट करने के लिए स्वागत से अधिक हैं।
मार्क बेन्क

7

'एक वस्तुनिष्ठ प्रश्न के इतने व्यक्तिपरक उत्तर। "विनीत" जावास्क्रिप्ट अंधविश्वासों का उपयोग न करने के पुराने नियम की तरह अंधविश्वास है। एक ऐसे तरीके से कोड लिखें, जो आपको अपने लक्ष्य को पूरा करने में मदद करता है, न कि किसी की धार्मिक धार्मिक मान्यताओं के अनुसार।

जो कोई भी मिल जाए:

 <body onload="body_onload();">

अत्यधिक विचलित होने के लिए अत्यधिक दिखावा है और उनकी प्राथमिकताएं सीधे नहीं हैं।

मैं सामान्य रूप से अपना जावास्क्रिप्ट कोड एक अलग .js फ़ाइल में डालता हूं, लेकिन मुझे HTML में ईवेंट हैंडलर को हुक करने के बारे में कुछ भी बोझिल नहीं लगता है, जो कि वैध HTML है।


39
विनीत जावास्क्रिप्ट लिखने के लिए अच्छा कारण है। मान लें कि आपके पास 100 पृष्ठों वाला एक वेब ऐप है और आपने प्रत्येक पृष्ठ द्वारा शामिल जावास्क्रिप्ट फ़ाइल में डालने के बजाय <body onload = "body_onload ();"> विधि का उपयोग किया है। फिर कल्पना करें कि आपको किसी कारण से उस फ़ंक्शन का नाम बदलने की आवश्यकता है। ईवेंट को शामिल किए गए जावास्क्रिप्ट फ़ाइल 1 में रखना) परिवर्तन को काफी सरल बनाता है, और 2) सर्वर संसाधनों को बचाता है क्योंकि एक ही कोड को बार-बार डाउनलोड करने के बजाय जावास्क्रिप्ट फ़ाइलों को एक वर्ष (ठीक से कॉन्फ़िगर किए गए सर्वर पर) के लिए कैश किया जा सकता है।
एंड्रयू एनस्ले जूल 8'11

21
इसलिए क्योंकि आप सीखने को परेशान नहीं करते हैं कि क्यों कुछ सुझाया गया है आप सिफारिशों को "ट्रेंडी धार्मिक विश्वास" लेबल करते हैं ??
हॉलवेर्स

6
सवाल यह है कि "इन दोनों तरीकों में क्या अंतर है?", एक सिफारिश के लिए अनुरोध के साथ जिसके लिए बेहतर है। आपकी प्रतिक्रिया उस प्रश्न का उत्तर कैसे देती है?
रिचर्ड टर्नर

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

1
आधुनिक ब्राउज़रों में XSS हमलों के खिलाफ एक अच्छा बचाव अपनी सामग्री सुरक्षा नीति के साथ सभी इनलाइन जावास्क्रिप्ट को अक्षम करना है। यह एक बहुत अच्छा कारण है कि आपके HTML में Onload विशेषता का उपयोग न करें।
ग्रेग बॉल

4

window.onload- सभी डोम, जेएस फाइल, इमेज, इफ्रेम, एक्सटेंशन और अन्य के बाद पूरी तरह से लोड होने के बाद कॉल किया गया। यह $ (विंडो) .load (फ़ंक्शन () {}) के बराबर है;

body onload=""- DOM लोड होते ही कॉल किया जाता है। यह $ (दस्तावेज़) के बराबर है। पहले से ही (फ़ंक्शन () {});


1
क्या कोई इसे स्रोत करने में सक्षम है? मैंने इस कथन को कई मंचों पर देखा है, लेकिन कभी भी इस कड़ी में परिभाषित नहीं किया गया है।
श्मशान

1
@ क्रेमप शरीर तत्व और वैश्विक गुण है , इसलिए मैं कहूंगा कि यह सच नहीं है। लेकिन आप स्वयं इसका परीक्षण कर सकते हैं, jsbin.com/OmiViPAJ/1/edit देखें । वहां, आप देख सकते हैं कि बॉडी ऑनलोड घटना से पहले छवि ऑनलोड घटना को निकाल दिया गया है।
ओलाफ डायटशे

2
यह उत्तर दूसरों का खंडन करता है; क्या आप कोई स्रोत प्रदान कर सकते हैं?
जिमी ब्रैक-मैके

2
api.jquery.com/ready jQuery डॉक्स का कहना है: "पहले से ही () विधि <body onload =" "> विशेषता के साथ असंगत है।" मुझे लगता है कि jQuery बॉडी.ऑन लोड $ (विंडो) .लोड (..) के अधिक करीब है, लेकिन मुझे लगता है कि वे अभी भी अलग हैं।
ccsakuweb

2
यह उत्तर पूरी तरह से गलत है और इसमें कोई वोट नहीं होना चाहिए। वास्तव में इस प्रकार के उत्तर को आमतौर पर readyबनाम onloadघटनाओं के बारे में सबसे बड़ी गलतफहमी के रूप में उद्धृत किया जाता है। loadसंपूर्ण स्क्रिप्ट, चित्र और स्टाइलशीट सहित संपूर्ण दस्तावेज़ लोड होने के बाद आग। DOMContentLoadedDOM ट्री के बनने के बाद आग लग जाती है लेकिन छवियों आदि से पहले इसकी DOMContentLoadedसमतुल्यता होती है document.ready, नहीं load
1

2

नहीं है कोई फर्क ...

इसलिए मुख्यतः आप दोनों का उपयोग कर सकते हैं (एक बार में! -)

लेकिन पठनीयता के लिए और html- कोड की सफाई के लिए मैं हमेशा window.onload! O! को पसंद करता हूं।


1

यदि आप विनीत JS कोड लिखने की कोशिश कर रहे हैं (और आपको होना चाहिए), तो आपको उपयोग नहीं करना चाहिए <body onload="">

यह मेरी समझ है कि अलग-अलग ब्राउज़र इन दोनों को थोड़ा अलग तरीके से संभालते हैं लेकिन वे इसी तरह काम करते हैं। अधिकांश ब्राउज़रों में, यदि आप दोनों को परिभाषित करते हैं, तो एक को अनदेखा कर दिया जाएगा।


1

किसी अन्य विशेषता की तरह ओनलोड के बारे में सोचें। उदाहरण के लिए, आप इनपुट बॉक्स पर रख सकते हैं:

<input id="test1" value="something"/>

या आप कॉल कर सकते हैं:

document.getElementById('test1').value = "somethingelse";

ओनलोड विशेषता उसी तरह काम करती है, सिवाय इसके कि यह एक फ़ंक्शन को स्ट्रिंग के बजाय इसके मूल्य के रूप में लेता है जैसे कि मूल्य विशेषता करता है। यह भी बताता है कि आप "केवल उनमें से एक का उपयोग क्यों कर सकते हैं" - कॉलिंग window.onload शरीर टैग के लिए ऑनलोड विशेषता के मूल्य को पुन: असाइन करता है।

साथ ही, जैसे अन्य यहाँ कह रहे हैं, आमतौर पर यह पेज की सामग्री से अलग शैली और जावास्क्रिप्ट को रखने के लिए क्लीनर है, यही वजह है कि ज्यादातर लोग window.onload या jQuery के तैयार फ़ंक्शन की तरह उपयोग करने की सलाह देते हैं।


1

<body onload = ""> window.onload को ओवरराइड करना चाहिए।

<Body onload = ""> के साथ, document.body.onload ब्राउज़र के आधार पर अशक्त, अपरिभाषित या एक फ़ंक्शन हो सकता है (हालाँकि getAttribute ("onload") अनाम फ़ंक्शन के शरीर को स्ट्रिंग के रूप में प्राप्त करने के लिए कुछ हद तक सुसंगत होना चाहिए) । Window.onload के साथ, जब आप इसे एक फंक्शन असाइन करते हैं, तो window.onload ब्राउज़र में लगातार एक फंक्शन होगा। यदि वह आपके लिए मायने रखता है, तो window.onload का उपयोग करें।

window.onload वैसे भी JS को आपकी सामग्री से अलग करने के लिए बेहतर है। जब आप window.onload का उपयोग कर सकते हैं, तब भी <body onload = ""> का उपयोग करने का बहुत कारण नहीं है।

ओपेरा में, window.onload और <body onload = ""> (और यहां तक ​​कि window.addEventListener ("लोड", func, false)) के लिए ईवेंट लक्ष्य सफारी और फ़ायरफ़ॉक्स जैसे दस्तावेज़ के बजाय विंडो होगा। लेकिन, 'यह' ब्राउज़रों के बीच की खिड़की होगी।

इसका मतलब यह है कि, जब यह मायने रखता है, तो आपको क्रूड को लपेटना चाहिए और चीजों को लगातार बनाना चाहिए या एक पुस्तकालय का उपयोग करना चाहिए जो आपके लिए करता है।


0

वे दोनों एक ही काम करते हैं। हालांकि, ध्यान दें कि यदि दोनों को परिभाषित किया गया है, तो उनमें से केवल एक को ही आमंत्रित किया जाएगा। मैं आम तौर पर दोनों में से किसी एक का उपयोग करने से सीधे बचता हूं। इसके बजाय, आप एक ईवेंट हैंडलर को लोड ईवेंट में संलग्न कर सकते हैं। इस तरह आप अधिक आसानी से अन्य जेएस पैकेजों को शामिल कर सकते हैं जिन्हें ऑनलोड घटना के लिए कॉलबैक संलग्न करना पड़ सकता है।

किसी भी जेएस फ्रेमवर्क में इवेंट हैंडलर के लिए क्रॉस-ब्राउज़र तरीके होंगे।


0

सामग्री, लेआउट और व्यवहार अलग-अलग होना एक स्वीकृत मानक है। तो window.onload () उपयोग करने के लिए अधिक उपयुक्त होगा, <body onload="">हालांकि दोनों समान कार्य करते हैं।


0

एक और 3 साल की नींद के बाद फिर से इस धागे के पुनर्जन्म के लिए खेद है, लेकिन शायद मैंने अंततः window.onload=fn1;ओवर का निर्विवाद लाभ पाया है <body onload="fn1()">। यह जेएस मॉड्यूल या ईएस मॉड्यूल की चिंता करता है : जब आपका onloadहैंडलर "क्लासिकल" जेएस फाइल में रहता है (अर्थात बिना <script type="module" … >किसी भी तरीके से, संभव है; जब आपका onloadहैंडलर "मॉड्यूल" जेएस फाइल में रहता है (यानी के साथ संदर्भित <script type="module" … >, तो <body onload="fn1()">fn1 के साथ विफल हो जाएगा) () परिभाषित नहीं किया गया है "त्रुटि। कारण शायद यह है कि ES मॉड्यूल HTML लोड होने से पहले लोड नहीं किए जाते हैं ... लेकिन यह सिर्फ मेरा अनुमान है। किसी भी तरह, window.onload=fn1;मॉड्यूल के साथ पूरी तरह से काम करता है ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.