Get Event Listener attached to node using addEventListener

Spojrzałem już na te pytania:

Jednak żaden z nich nie odpowiada, jak uzyskać listę zdarzeń dołączonych do węzła za pomocą addEventListener, bez modyfikowanie prototypu addEventListener przed wytworzeniem detektorów zdarzeń.

VisualEvent nie wyświetla wszystkich detektorów zdarzeń (specyficznych dla iphone ' a) i chcę to zrobić (nieco) programowo.

Author: Community, 2012-01-28

4 answers

Chrome DevTools, Safari Inspector i Firebug support getEventListeners(węzeł).

getEventListeners(dokument)

 101
Author: NVI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-01 18:38:10

Nie możesz.

Jedynym sposobem na uzyskanie listy wszystkich słuchaczy zdarzeń dołączonych do węzła jest przechwycenie połączenia z listener attachment.

DOM4 addEventListener

Mówi

Dołącza detektor zdarzeń do powiązanej listy detektorów zdarzeń z typem ustawionym na typ, listener ustawionym na listener I capture ustawionym na capture, chyba że na liście jest już detektor zdarzeń o tym samym typie, listener I capture.

Czyli słuchacz zdarzeń jest dodawany do "listy słuchaczy zdarzeń". To wszystko. Nie ma pojęcia, czym powinna być Ta lista, ani jak powinieneś do niej uzyskać dostęp.

 51
Author: Raynos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-05 23:01:47

Ponieważ nie ma natywnego sposobu ,aby to zrobić, oto mniej natrętne rozwiązanie, które znalazłem (nie dodawaj żadnych 'starych' metod prototypowych):

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();
 17
Author: yorg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-06 01:01:51

Możesz uzyskać wszystkie zdarzenia jQuery używając $._data ($('[selektor]') [0],'events'); Zmień [selektor] na to, czego potrzebujesz.

Istnieje plugin zbierający wszystkie zdarzenia dołączone przez jQuery o nazwie eventsReport.

Również piszę własną wtyczkę, która robi to z lepszym formatowaniem.

Ale wygląda na to, że nie możemy zebrać zdarzeń dodanych metodą addEventListener. Być może możemy zawijać wywołanie addeventlistener do przechowywania zdarzeń dodanych po naszym wywołaniu zawijania.

It seems the best way to zobacz zdarzenia dodane do elementu za pomocą narzędzi dev.

Ale nie zobaczysz tam żadnych wydarzeń. Więc potrzebujemy jQuery eventsReport.

UPDATE: teraz możemy zobaczyć zdarzenia dodane metodą addEventListener zobacz prawidłową odpowiedź na to pytanie.

 2
Author: Rantiev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 18:46:10