বেনামে ফাংশন সহ অ্যাডভেঞ্চারলিস্টনার যে কীভাবে ইভেন্টলিস্টনার সরান?


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. ');

উত্তর:


111

আপনি পারবেন না। আপনাকে একটি নামকৃত ফাংশন ব্যবহার করতে হবে বা কোনওভাবে রেফারেন্সটি সঞ্চয় করতে হবে।

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);

ডেমো


কাঠামোগত উপায় কি আপনি ব্যাখ্যা করতে পারেন? আমার ইংরেজি দক্ষতা বুঝতে পারার পক্ষে তেমন ভাল নয় ... ধন্যবাদ
জাপবয়

4
@ জ্যাপবয়: আপনাকে স্বাগতম: আমি কেবলমাত্র একটি সামান্য ভুল লক্ষ্য করেছি এবং এটি ঠিক করেছি।
ফেলিক্স ক্লিং

আপনি কেন অ্যাডলিস্টনার এবং মুছে ফেলুন?
অকেজো

@ নির্বিঘ্ন: আপনি কি স্ব-চাওয়া ফাংশন বলতে চাইছেন? রাখা iএবং listeners"ব্যক্তিগত" রাখা ।
ফেলিক্স ক্লিং

4
@ বার্গি: হয়ে গেছে। আমি যদি কিছু মিস করি তবে আমাকে জানান।
ফেলিক্স ক্লিং

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); };
সাইচোই

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();

কোন ইভেন্টগুলি এই জাতীয় বস্তুর উপর আবদ্ধ হয়েছে তা নির্ধারণ করা সম্ভব?
frumbert

টাইপ, স্কোপ ইত্যাদির মতো আপনি এই ফাংশনে কিছু বৈশিষ্ট্য যুক্ত করতে পারেনconst disposerFn = () => { scope.removeEventListener(type, handler, capture); } disposerFn.type = type; return disposerFn;
সাইমন জেন্টস

1

আপনি যদি আইই সমর্থন করতে না চান, আপনি একবার বিকল্প ব্যবহার করতে পারেন

[Element].addEventListener('click', () => {...}, {
  capture: false,
  once: true
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.