AddEventListener ব্যবহার করে নোডের সাথে সংযুক্ত ইভেন্ট শ্রোতাদের পান


113

আমি এই প্রশ্নগুলি ইতিমধ্যে দেখেছি:

তবে ইভেন্টের শ্রোতার তৈরি হওয়ার আগে প্রোটোটাইপটি addEventListenerপরিবর্তন না করে কীভাবে কোনও নোড ব্যবহার করে ইভেন্ট শ্রোতার তালিকা পাবেন তা তাদের উত্তর দেয় না addEventListener

ভিজ্যুভ্যালেন্ট সমস্ত ইভেন্ট শ্রোতা (আইফোন নির্দিষ্ট ব্যক্তিদের) প্রদর্শন করে না এবং আমি এটি (কিছুটা) প্রোগ্রামগতভাবে করতে চাই।



"কিছুটা প্রোগ্রামগতভাবে" এবং এই প্রশ্নের গৃহীত উত্তর একটি ডিভলটুল বৈশিষ্ট্য হ'ল এটি তালিকাভুক্ত প্রশ্নের নকল করে তোলে। যারা জেএস সমাধানের সন্ধান করছেন তাদের জন্য উত্তরটি "একটি নেই"
নিকোলো

উত্তর:


143

ক্রোম ডেভটুলস , সাফারি ইন্সপেক্টর এবং ফায়ারব্যাগ সমর্থন করুনভেন্টলিস্টেনার্স (নোড)

getEventListeners (দস্তাবেজ)


6
আমি লক্ষ করতে চাই যে getEventListeners পদ্ধতি ফায়ারফক্স 35 সংস্করণ সমর্থন করে না।
MURATSPLAT

এটি ফায়ারফক্সে কাজ নাও করতে পারে তবে তারপরে আবার একাধিক ব্রাউজারে ডেভস বিকাশ ঘটবে / যদি নিশ্চিতভাবেই যদি কোনও বিদ্যমান সাইট সংশোধন করতে হয় তবে এটি সাহায্য করবে ... অনেক!
জেসনএক্সএ

4
না এটা ফায়ারফক্স 69.
ভিতালি Zdanevich

66

আপনি পারবেন না।

নোডের সাথে সংযুক্ত সমস্ত ইভেন্ট শ্রোতার তালিকা পাওয়ার একমাত্র উপায় হ'ল শ্রোতার সংযুক্তি কলটি বাধা দেওয়া।

ডিওএম 4 অ্যাডভেন্টলিস্টনার

বলে

টাইপ সেট, শ্রোতার কাছে শ্রোতার জন্য সেট, এবং ক্যাপচারের জন্য ক্যাপচার সেট টাইপযুক্ত ইভেন্ট শ্রোতার তালিকা সম্পর্কিত ইভেন্ট শ্রোতার সাথে যুক্ত করুন, যদি না একই ধরণের, শ্রোতা এবং ক্যাপচারের সাথে তালিকায় ইতিমধ্যে ইভেন্ট শ্রোতা না থাকে।

মানে একটি ইভেন্ট শ্রোতাকে "ইভেন্ট শ্রোতার তালিকায়" যুক্ত করা হয়েছে। এখানেই শেষ. এই তালিকাটি কী হওয়া উচিত এবং আপনার কীভাবে এটি অ্যাক্সেস করা উচিত সে সম্পর্কে কোনও ধারণা নেই।


12
কিছু উপায় সমর্থন বা যুক্তি সরবরাহ করার কোনও সুযোগ কেন এটি এইভাবে কাজ করতে হবে? স্পষ্টতই ব্রাউজারটি জানে যে সমস্ত শ্রোতা কী।
ডার্থ এগ্রিগিয়াস

4
@ ইউজার 973810: আপনি কীভাবে তাকে এটি ন্যায়সঙ্গত করতে চান? ডোম এপিআই এটি করার কোনও উপায় সরবরাহ করে না এবং বর্তমান ব্রাউজারগুলিতে এটি করার কোনও অ-মানক উপায় নেই। কেন এই ঘটনা, আমি সত্যিই জানি না। এটি করতে একটি যুক্তিসঙ্গত জিনিস বলে মনে হচ্ছে।
টিম ডাউন

এর জন্য ডিওমে একটি এপিআই যুক্ত করার বিষয়ে আমি কয়েকটি থ্রেড পড়ে থাকতে দেখেছি।
রায়নস

@ টিমডাউন সম্পাদনা সাহায্য করে। "GetEventListeners" এর মতো কোনও কিছুর জন্য কোনও স্পেসিফিকেশন নেই তা দেখায় যে কেন এমন জিনিস নেই।
দারথ এগ্রিজিয়াস

25

যেহেতু এটি করার কোনও নেটিভ উপায় নেই, তাই এখানে আমি খুঁজে পেয়েছি এমন কম অনুপ্রবেশজনক সমাধান (কোনও 'পুরানো' প্রোটোটাইপ পদ্ধতি যুক্ত করবেন না):

var ListenerTracker=new function(){
    var is_active=false;
    // listener tracking datas
    var _elements_  =[];
    var _listeners_ =[];
    this.init=function(){
        if(!is_active){//avoid duplicate call
            intercep_events_listeners();
        }
        is_active=true;
    };
    // register individual element an returns its corresponding listeners
    var register_element=function(element){
        if(_elements_.indexOf(element)==-1){
            // NB : split by useCapture to make listener easier to find when removing
            var elt_listeners=[{/*useCapture=false*/},{/*useCapture=true*/}];
            _elements_.push(element);
            _listeners_.push(elt_listeners);
        }
        return _listeners_[_elements_.indexOf(element)];
    };
    var intercep_events_listeners = function(){
        // backup overrided methods
        var _super_={
            "addEventListener"      : HTMLElement.prototype.addEventListener,
            "removeEventListener"   : HTMLElement.prototype.removeEventListener
        };

        Element.prototype["addEventListener"]=function(type, listener, useCapture){
            var listeners=register_element(this);
            // add event before to avoid registering if an error is thrown
            _super_["addEventListener"].apply(this,arguments);
            // adapt to 'elt_listeners' index
            useCapture=useCapture?1:0;

            if(!listeners[useCapture][type])listeners[useCapture][type]=[];
            listeners[useCapture][type].push(listener);
        };
        Element.prototype["removeEventListener"]=function(type, listener, useCapture){
            var listeners=register_element(this);
            // add event before to avoid registering if an error is thrown
            _super_["removeEventListener"].apply(this,arguments);
            // adapt to 'elt_listeners' index
            useCapture=useCapture?1:0;
            if(!listeners[useCapture][type])return;
            var lid = listeners[useCapture][type].indexOf(listener);
            if(lid>-1)listeners[useCapture][type].splice(lid,1);
        };
        Element.prototype["getEventListeners"]=function(type){
            var listeners=register_element(this);
            // convert to listener datas list
            var result=[];
            for(var useCapture=0,list;list=listeners[useCapture];useCapture++){
                if(typeof(type)=="string"){// filtered by type
                    if(list[type]){
                        for(var id in list[type]){
                            result.push({"type":type,"listener":list[type][id],"useCapture":!!useCapture});
                        }
                    }
                }else{// all
                    for(var _type in list){
                        for(var id in list[_type]){
                            result.push({"type":_type,"listener":list[_type][id],"useCapture":!!useCapture});
                        }
                    }
                }
            }
            return result;
        };
    };
}();
ListenerTracker.init();

আপনার এটিকে উইন্ডো ইভেন্ট শ্রোতাদের বিরতি দেওয়া উচিত। তা ছাড়া, এটি দুর্দান্ত কাজ করে!

2

আপনি j ._ ডেটা ($ ('[নির্বাচক]') [[0], 'ইভেন্ট') ব্যবহার করে সমস্ত jQuery ইভেন্টগুলি পেতে পারেন; [নির্বাচক] আপনার যা প্রয়োজন তা পরিবর্তন করুন।

এমন একটি প্লাগইন রয়েছে যা jQuery দ্বারা সংযুক্ত সমস্ত ইভেন্টগুলিকে ইভেন্ট রেপপোর্ট নামে একত্রিত করে।

এছাড়াও আমি আমার নিজস্ব প্লাগইন লিখি যা আরও ভাল ফর্ম্যাটিংয়ের সাথে এটি করে।

তবে যাইহোক এটি দেখে মনে হচ্ছে আমরা অ্যাডএভেন্টলিস্টনার পদ্ধতিতে যুক্ত ইভেন্টগুলি সংগ্রহ করতে পারি না। হতে পারে আমরা আমাদের মোড়কের কলের পরে যুক্ত ইভেন্টগুলিতে অ্যাডেন্টেন্টলিস্টনার কলটি গুটিয়ে রাখতে পারি।

এটি ডিভাইসগুলির সাহায্যে কোনও উপাদানের সাথে ইভেন্টগুলি যুক্ত করার সর্বোত্তম উপায় বলে মনে হয়।

তবে আপনি সেখানে ডেলিগ্রেড ইভেন্টগুলি দেখতে পাবেন না। সুতরাং সেখানে আমাদের jQuery ইভেন্টস রিপোর্ট দরকার।

আপডেট: এখন আমরা অ্যাডএভেন্টলিস্টনার পদ্ধতিতে যুক্ত ইভেন্টগুলি দেখতে পারি এই প্রশ্নের সঠিক উত্তরটি দেখুন।


এটি একটি ব্যক্তিগত এবং অবহেলিত ইন্টারফেস এবং এটি শীঘ্রই চলে যেতে পারে তাই এর উপর নির্ভর করবেন না।
মিলিগল

4
হ্যাঁ, তবে যে সময় আমি উত্তর দিয়েছি, দেব সরঞ্জামগুলিতে এমন কোনও ক্ষমতা ছিল না। সুতরাং, থেকে চয়ন করার কিছুই ছিল না।
রণটিভ

এটি @ রান্তিভকে অবহেলা করা হয়েছে, আপনি কি এই উত্তরটি সরাতে পারবেন?
জুলিও মেরিন্স

2

আমি কোড দিয়ে এটি করার কোনও উপায় খুঁজে পাচ্ছি না, তবে ফায়ারফক্স 64৪ স্টকগুলিতে এমডিএন এর পরীক্ষা ইভেন্ট শ্রোতাদের পৃষ্ঠায় উল্লিখিত হিসাবে এবং এই চিত্রটিতে প্রদর্শিত হিসাবে ডেভেলপার সরঞ্জাম পরিদর্শকের প্রতিটি এইচটিএমএল সত্তার পাশে ইভেন্টগুলি তালিকাভুক্ত করা হয়েছে :

এফএফ পরিদর্শকের স্ক্রিন শট

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.