अनाम फ़ंक्शन के साथ addEventListener को हटाने के लिए कैसे करें?


88
function doSomethingWith(param)
{
    document.body.addEventListener(
        'scroll',
        function()
        {
            document.write(param);
        },
        false
    ); // An event that I want to remove later
}
setTimeout(
    function()
    {
        document.body.removeEventListener('scroll', HANDLER ,false);
            // What HANDLER should I specify to remove the anonymous handler above?
    },
    3000
);
doSomethingWith('Test. ');

जवाबों:


110

आप नहीं कर सकते। आपको किसी नामित फ़ंक्शन का उपयोग करना होगा या किसी भी तरह से संदर्भ को संग्रहीत करना होगा।

var handler;

function doSomethingWith(param) {
    handler = function(){
        document.write(param);
    };  
    document.body.addEventListener('scroll', handler,false);
}
setTimeout(function() {
     document.body.removeEventListener('scroll', handler ,false);
}, 3000);

सबसे अच्छा यह होगा कि इसे संरचित तरीके से किया जाए, ताकि आप विभिन्न हैंडलर की पहचान कर सकें और उन्हें हटा सकें। उपरोक्त उदाहरण में, आप स्पष्ट रूप से केवल अंतिम हैंडलर निकाल सकते हैं।

अपडेट करें:

आप अपना स्वयं का हैंडलर बना सकते हैं (:)):

var Handler = (function(){
    var i = 1,
        listeners = {};

    return {
        addListener: function(element, event, handler, capture) {
            element.addEventListener(event, handler, capture);
            listeners[i] = {element: element, 
                             event: event, 
                             handler: handler, 
                             capture: capture};
            return i++;
        },
        removeListener: function(id) {
            if(id in listeners) {
                var h = listeners[id];
                h.element.removeEventListener(h.event, h.handler, h.capture);
                delete listeners[id];
            }
        }
    };
}());

तब आप इसका उपयोग कर सकते हैं:

function doSomethingWith(param) {
    return Handler.addListener(document.body, 'scroll', function() {
        document.write(param);
    }, false);
}

var handler = doSomethingWith('Test. ');

setTimeout(function() {
     Handler.removeListener(handler);
}, 3000);

डेमो


क्या आप बता सकते हैं कि संरचित तरीका क्या है? मेरी अंग्रेजी कौशल यह समझने के लिए पर्याप्त नहीं है कि ... धन्यवाद।
जपबॉय

1
@ जैपबॉय: आपका स्वागत है :) मैंने बस थोड़ी सी गलती पर ध्यान दिया और इसे ठीक किया।
फेलिक्स क्लिंग

आप AddListener और RemoveListener को क्यों लपेटेंगे?
बेकार

@useless: क्या आपका मतलब सेल्फ-इनवोकेशन फंक्शन से है? रखने के लिए iऔर listeners"निजी"।
फेलिक्स क्लिंग

2
@ बर्गी: हो गया। अगर कुछ छूट गया तो मुझे बता देना।
फेलिक्स क्लिंग

11

आप फ़ंक्शन के संदर्भ की आवश्यकता नहीं कर सकते:

function doSomethingWith(param) {
   var fn = function(){ document.write(param); };
   document.body.addEventListener('scroll', fn, false);
   setTimeout(function(){ document.body.removeEventListener('scroll', fn, false); }, 3000);
}
doSomethingWith('Test. ');

आप कैसे ईवेंट पास करते हैं?
स्लीपर

@ शालीनvar fn = function(event){ document.write(param); };
cychoi

5

आप ऐसा भी कर सकते हैं:

const ownAddEventListener = (scope, type, handler, capture) => {
  scope.addEventListener(type, handler, capture);
  return () => {
    scope.removeEventListener(type, handler, capture);    
  }
}

तब आप इस तरह से ईवेंट श्रोता को हटा सकते हैं:

// Add event listener
const disposer = ownAddEventListener(document.body, 'scroll', () => { 
  // do something
}, false);

// Remove event listener
disposer();

क्या यह निर्धारित करना संभव है कि कौन सी घटनाएं इस तरह से वस्तु पर बंधी हुई हैं?
फ्रैंबर्ट रॉबर्ट

आप फ़ंक्शन में कुछ गुण जोड़ सकते हैं, जैसे कि टाइप, स्कोप आदिconst disposerFn = () => { scope.removeEventListener(type, handler, capture); } disposerFn.type = type; return disposerFn;
सिमोन जेंट्सच

1

यदि आपको IE का समर्थन नहीं करना है, तो आप एक बार विकल्प का उपयोग कर सकते हैं

[Element].addEventListener('click', () => {...}, {
  capture: false,
  once: true
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.