2013-03-22 5 views
41

मैं window.onload घटना के लिए एक और विधि कॉल जोड़ने के बारे में एक बार यह पहले से ही एक विधि कॉल सौंपा गया है सोच रहा हूँ।घटना window.onload को जोड़ने?

स्क्रिप्ट मैं इस काम है में

मान लीजिए कहीं ...

window.onload = function(){ some_methods_1() }; 

और फिर बाद में स्क्रिप्ट मैं इस काम है में पर

window.onload = function(){ some_methods_2() }; 

यह खड़ा के रूप में, केवल some_methods_2 बुलाया जाएगा । वहाँ किसी भी तरह से some_methods_1 रद्द किए बिना पिछले window.onload कॉलबैक में जोड़ने के लिए है? (और यह भी दोनों some_methods_1() और एक ही समारोह ब्लॉक में some_methods_2() को शामिल किए बिना)।

मुझे लगता है कि यह प्रश्न वास्तव में window.onload पर नहीं बल्कि सामान्य रूप से जावास्क्रिप्ट के बारे में एक प्रश्न है। मैं window.onload को इस तरह से कुछ असाइन नहीं करना चाहता हूं कि यदि कोई अन्य डेवलपर स्क्रिप्ट पर काम करना चाहता था और कोड का एक टुकड़ा जोड़ता है जो window.onload (मेरे पिछले कोड को देखे बिना) का उपयोग करता है, तो वह मेरे ऑनलोड ईवेंट को अक्षम कर देगा ।

मैं भी jQuery में एक ही बात के बारे में

$(document).ready() 

सोच रहा हूँ। मैं कैसे नष्ट किए बिना यह करने के लिए जोड़ सकते हैं क्या से पहले आया था, या बाद में क्या आ सकता है?

+1

'$ (document) .ready()' एकत्रित श्रृंखला अद्यतन करेगा। अगर jQuery के हाथ में है तो इसका इस्तेमाल करें। –

उत्तर

28

यदि आप jQuery का उपयोग कर रहे हैं, तो आपको कुछ भी विशेष करने की ज़रूरत नहीं है। $(document).ready() के माध्यम से जोड़ा हैंडलर एक दूसरे को ओवरराइट नहीं, बल्कि बदले में निष्पादित करें: के रूप में Karaxuna द्वारा प्रदर्शन,

$(document).ready(func1) 
... 
$(document).ready(func2) 

आप jQuery उपयोग नहीं कर रहे हैं, तो आप addEventListener इस्तेमाल कर सकते हैं, के साथ साथ attachEvent आईई < 9 के लिए ।

ध्यान दें कि onload$(document).ready() के बराबर नहीं है - पूर्व सीएसएस, छवियों के लिए इंतजार कर रहा है ... साथ ही, बाद वाला केवल डोम पेड़ की प्रतीक्षा करता है। आधुनिक ब्राउज़र (और IE 9 के बाद से IE) दस्तावेज़ पर DOMContentLoaded ईवेंट का समर्थन करता है, जो jQuery ready ईवेंट से मेल खाता है, लेकिन IE < 9 नहीं है।

if(window.addEventListener){ 
    window.addEventListener('load', func1) 
}else{ 
    window.attachEvent('onload', func1) 
} 
... 
if(window.addEventListener){ 
    window.addEventListener('load', func2) 
}else{ 
    window.attachEvent('onload', func2) 
} 

तो न विकल्प उपलब्ध है (उदाहरण के लिए, आप डोम नोड्स के साथ काम नहीं कर रहे हैं), तब भी आप ऐसा कर सकते हैं (मैं एक उदाहरण के रूप onload का उपयोग कर रहा है, लेकिन अन्य विकल्प के लिए उपलब्ध हैं onload):

var oldOnload1=window.onload; 
window.onload=function(){ 
    oldOnload1 && oldOnload1(); 
    func1(); 
} 
... 
var oldOnload2=window.onload; 
window.onload=function(){ 
    oldOnload2 && oldOnload2(); 
    func2(); 
} 

या, ग्लोबल नेमस्पेस को दूषित (और संभावित नाम स्थान टकराव का सामना), आयात/निर्यात Iife पद्धति का उपयोग कर से बचने के लिए:

window.onload=(function(oldLoad){ 
    return function(){ 
    oldLoad && oldLoad(); 
    func1(); 
    } 
})(window.onload) 
... 
window.onload=(function(oldLoad){ 
    return function(){ 
    oldLoad && oldLoad(); 
    func2(); 
    } 
})(window.onload) 
+1

आपका मतलब है "document.attachEvent ('onload' ...)", 'लोड' नहीं। ;) –

+0

@ जेम्स जेम्सकिन्स आप सही हैं। फिक्स्ड, धन्यवाद –

+0

आपको दस्तावेज़ का उपयोग नहीं करना चाहिए .addEventListener ("load") (फ़ायरफ़ॉक्स के मेरे संस्करण पर काम नहीं करता है) बल्कि इसके बजाय window.addEventListener ("load")। Http://stackoverflow.com/q/16404380/94102 –

42

आप attachEvent (IE8) और addEventListener उपयोग कर सकते हैं बजाय

addEvent(window, 'load', function(){ some_methods_1() }); 
addEvent(window, 'load', function(){ some_methods_2() }); 

function addEvent(element, eventName, fn) { 
    if (element.addEventListener) 
     element.addEventListener(eventName, fn, false); 
    else if (element.attachEvent) 
     element.attachEvent('on' + eventName, fn); 
} 
+0

ताकि इसे क्रॉस-ब्राउज़र संगत बनाने के लिए, मुझे दोनों का उपयोग करना चाहिए? इसके अलावा, यदि बाद में स्क्रिप्ट में मैं विंडो में कॉलबैक संलग्न करता हूं तो पहले addEventListener का उपयोग करके लोड करें, जो भी मैंने addEventListener के साथ असाइन किया है, रद्द हो जाता है? – pepper

+3

@pepper अद्यतन उत्तर। नहीं, इसे – karaxuna

6

वहाँ मूलतः दो तरीके

  1. दुकान कर रहे हैं window.onload के पिछले मूल्य तो अपने कोड है, तो इससे पहले कि वर्तमान पिछले हैंडलर कॉल कर सकते हैं या अपने कोड निष्पादित करता है के बाद

  2. addEventListener दृष्टिकोण का उपयोग कर (कि निश्चित रूप से माइक्रोसॉफ्ट पसंद नहीं है और एक अन्य भिन्न नाम का उपयोग करने के लिए) की आवश्यकता है।

दूसरी विधि आप थोड़ा और अधिक सुरक्षा दे देंगे एक और स्क्रिप्ट window.onload उपयोग करना चाहता है और सहयोग लेकिन जावास्क्रिप्ट के लिए मुख्य धारणा है कि सभी स्क्रिप्ट सहयोग करेंगे की तरह तुम क्या करने की कोशिश कर रहे है के लिए बिना सोचे यह करता है, तो ।

ध्यान दें कि एक बुरी स्क्रिप्ट जिसे अन्य अज्ञात स्क्रिप्ट के साथ काम करने के लिए डिज़ाइन नहीं किया गया है, वह वैश्विक नामस्थान को दूषित करके या डोम को नुकसान पहुंचाकर प्रोटोटाइप के साथ गड़बड़ कर उदाहरण के लिए एक पृष्ठ तोड़ने में सक्षम होगा।

+0

रद्द नहीं किया जाएगा यह बहुत अच्छा है! jquery के $ (दस्तावेज़) .ready() या बाइंड() के बारे में क्या? – pepper

+0

क्या आपको एहसास है कि jquery सिर्फ जावास्क्रिप्ट है, है ना? मैंने जांच नहीं की लेकिन मेरा अनुमान यह है कि यह शायद (2) यदि उपलब्ध हो या पुराने ब्राउज़र के लिए (1) का उपयोग कर रहा है। – 6502

+0

निश्चित रूप से, मैं बस पूछ रहा था क्योंकि $ (दस्तावेज़) .ready() window.onload से थोड़ा अलग है ... "एचटीएमएल दस्तावेज़ लोड होने के बाद तैयार घटना होती है, जबकि ऑनलोड घटना बाद में होती है, जब सभी सामग्री (जैसे छवियों) को भी लोड किया गया है। " – pepper

1

यह एक लोकप्रिय विकल्प नहीं हो सकता है, लेकिन कभी कभी स्क्रिप्ट अंत विभिन्न मात्रा में वितरित किया जा रहा है, उस मामले में मैं इस पाया है त्वरित सुधार

if(window.onload != null){var f1 = window.onload;} 
window.onload=function(){ 
    //do something 

    if(f1!=null){f1();} 
} 

तो कहीं और किया जाना है। ..

if(window.onload != null){var f2 = window.onload;} 
window.onload=function(){ 
    //do something else 

    if(f2!=null){f2();} 
} 

इस ऑनलोड समारोह और जरूरत

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