AddEventListener () / संलग्नक () का सही उपयोग?


81

मैं सोच रहा हूँ कि addEventListenerक्रमशः attachEventसही ढंग से कैसे उपयोग करें ?

window.onload = function (myFunc1) { /* do something */ }

function myFunc2() { /* do something */ }

if (window.addEventListener) {
  window.addEventListener('load', myFunc2, false);
} else if (window.attachEvent) {
  window.attachEvent('onload', myFunc2);
}

 // ...

या

function myFunc1() { /* do something */ }

if (window.addEventListener) {
  window.addEventListener('load', myFunc1, false);
} else if (window.attachEvent) {
  window.attachEvent('onload', myFunc1);
}

function myFunc2() { /* do something */ }

if (window.addEventListener) {
  window.addEventListener('load', myFunc2, false);
} else if (window.attachEvent) {
  window.attachEvent('onload', myFunc2);
}

 // ...

?

क्या यह क्रॉस-ब्राउज़र सुरक्षित है या मुझे इस तरह से कुछ बेहतर करना चाहिए:

function myFunc1(){ /* do something */ }
function myFunc2(){ /* do something */ }
// ...

function addOnloadEvent(fnc){
  if ( typeof window.addEventListener != "undefined" )
    window.addEventListener( "load", fnc, false );
  else if ( typeof window.attachEvent != "undefined" ) {
    window.attachEvent( "onload", fnc );
  }
  else {
    if ( window.onload != null ) {
      var oldOnload = window.onload;
      window.onload = function ( e ) {
        oldOnload( e );
        window[fnc]();
      };
    }
    else
      window.onload = fnc;
  }
}

addOnloadEvent(myFunc1);
addOnloadEvent(myFunc2);
// ...

और: कहना myfunc2केवल IE 7 के लिए है। तदनुसार सही / पसंदीदा विधि को कैसे संशोधित किया जाए?


हो सकता है कि आप मुझे ऐसा कहने के लिए पसंद न करें, लेकिन आप ऐसे मुद्दों से निपटने के लिए एक रूपरेखा का उपयोग क्यों नहीं करेंगे?
प्वाईंट

मैं, लेकिन मैं इस मामले में नहीं कर सकता। तो, क्या आप मुझे इसके साथ मदद कर सकते हैं, कृपया?
गिन्नी

@ मेरे जवाब पर एक नज़र है। अगर आपको इससे अधिक स्पष्टीकरण की आवश्यकता है, तो मुझे बताएं।
hitautodestruct

1
बहुत कम से कम, आपको इवेंट मॉडल के लिए हर बार परीक्षण नहीं करना चाहिए जो आप किसी घटना को पंजीकृत करना चाहते हैं। इसे आसानी से एक सामान्य फ़ंक्शन में अलग किया जा सकता है, जिसमें आप तत्व , ईवेंट प्रकार और हैंडलर पास करते हैं
Mrhhite

जवाबों:


132

दोनों का उपयोग समान है, हालांकि दोनों इवेंट पैरामीटर के लिए थोड़ा अलग सिंटैक्स लेते हैं:

addEventListener ( mdn संदर्भ ):

सभी प्रमुख ब्राउज़रों (FF, Chrome, Edge) द्वारा समर्थित

obj.addEventListener('click', callback, false);

function callback(){ /* do stuff */ }

घटनाक्रम की सूची के लिए addEventListener

संलग्नक ( msdn संदर्भ ):

IE 5-8 * द्वारा समर्थित

obj.attachEvent('onclick', callback);

function callback(){ /* do stuff */ }

घटनाक्रम की सूची के लिए attachEvent

बहस

दोनों विधियों के लिए तर्क निम्नानुसार हैं:

  1. घटना प्रकार है।
  2. क्या घटना शुरू होने के बाद कॉल करने का कार्य है।
  3. ( addEventListenerकेवल) यदि सही है, तो इंगित करता है कि उपयोगकर्ता कैप्चर आरंभ करना चाहता है ।

व्याख्या

किसी तत्व को एक घटना को संलग्न करने के समान लक्ष्य को प्राप्त करने के लिए दोनों विधियों का उपयोग किया जाता है।
अंतर किया जा रहा है वह यह है कि attachEventकेवल पुराने पर इस्तेमाल किया जा सकता त्रिशूल प्रतिपादन इंजन ( IE5 + IE5-8 *) और addEventListenerएक डब्ल्यू 3 मानक है जो अन्य ब्राउज़र (एफएफ, वेबकिट, ओपेरा, IE9 +) के बहुमत में कार्यान्वित किया जाता है।

नॉर्मलाइज़ेशन सहित सॉलिड क्रॉस ब्राउज़र इवेंट सपोर्ट के लिए जो आपको डियाज़ समाधान के साथ नहीं मिलेगा, एक फ्रेमवर्क का उपयोग करें

* IE9-10 बैकवर्ड संगतता के लिए दोनों तरीकों का समर्थन करता है।

IE11 से हटा दिया गया है कि बाहर की ओर इशारा करने के लिए ल्यूक पुलेट को धन्यवाद attachEvent

न्यूनतम पार ब्राउज़र कार्यान्वयन

जैसा कि स्माइली ने सिफारिश की थी कि आपको इस डस्टिन डियाज़ पर एक नज़र डालनी चाहिए एक फ्रेम के उपयोग के बिना एक ठोस क्रॉस ब्राउज़र कार्यान्वयन के लिए:

function addEvent(obj, type, fn) {
  if (obj.addEventListener) {
    obj.addEventListener(type, fn, false);
  }
  else if (obj.attachEvent) {
    obj["e"+type+fn] = fn;
    obj[type+fn] = function() {obj["e"+type+fn](window.event);}
    obj.attachEvent("on"+type, obj[type+fn]);
  }
  else {
    obj["on"+type] = obj["e"+type+fn];
  }
}

addEvent( document, 'click', function (e) {
  console.log( 'document click' )
})


@CamiloMartin यदि आप इस तरह की टिप्पणी करते हैं, तो आपको हमेशा अच्छा जवाब देना होगा, धन्यवाद :)
hitautodestruct

13
addEventListenerIE9 + द्वारा भी समर्थित है।
MrWhite

1
संलग्नक को IE11 में हटा दिया गया है, इसलिए IE का पता लगाने और इस API का उपयोग करने वाला कोड अब विफल हो जाएगा। मैंने अभी तक ऐसा नहीं देखा है, लेकिन मैंने देखा है कि IE11 से IE10 एजेंट स्ट्रिंग को स्पूफ करना स्क्रिप्ट त्रुटियों का कारण बन सकता है।
ल्यूक पुप्लेट

@LukePuplett डस्टिन डियाज़ कार्यान्वयन ब्राउज़र का पता लगाने वाले फ़ीचर न करने पर आधारित है। क्या आप इसका उल्लेख कर रहे हैं?
hitautodestruct

7

अभी भी कोई भी इस चर्चा को टाल रहा है और वह जवाब नहीं खोज रहा है जो वे चेकआउट के लिए देख रहे थे:
http://dustindiaz.com/rock-solid-addevent

यह सबसे सुंदर समाधानों में से एक है जो मुझे उन लोगों के लिए मिला है जो चौखटे का उपयोग करने पर प्रतिबंध लगाते हैं।

function addEvent(obj, type, fn) {

    if (obj.addEventListener) {
        obj.addEventListener(type, fn, false);
        EventCache.add(obj, type, fn);
    } else if (obj.attachEvent) {
        obj["e" + type + fn] = fn;
        obj[type + fn] = function() {
            obj["e" + type + fn](window.event);
        }
        obj.attachEvent("on" + type, obj[type + fn]);
        EventCache.add(obj, type, fn);
    } else {
        obj["on" + type] = obj["e" + type + fn];
    }

}

var EventCache = function() {

    var listEvents = [];
    return {
        listEvents: listEvents,
        add: function(node, sEventName, fHandler) {
            listEvents.push(arguments);
        },
        flush: function() {
            var i, item;

            for (i = listEvents.length - 1; i >= 0; i = i - 1) {
                item = listEvents[i];
                if (item[0].removeEventListener) {
                    item[0].removeEventListener(item[1], item[2], item[3]);
                };

                if (item[1].substring(0, 2) != "on") {
                    item[1] = "on" + item[1];
                };

                if (item[0].detachEvent) {
                    item[0].detachEvent(item[1], item[2]);
                };

                item[0][item[1]] = null;
            };
        }
    };
}();

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