How to find event listeners on a DOM node when debugging or from the JavaScript code?

前端 未结 19 2488
臣服心动
臣服心动 2020-11-21 05:34

I have a page where some event listeners are attached to input boxes and select boxes. Is there a way to find out which event listeners are observing a particular DOM node a

19条回答
  •  小鲜肉
    小鲜肉 (楼主)
    2020-11-21 06:09

    1: Prototype.observe uses Element.addEventListener (see the source code)

    2: You can override Element.addEventListener to remember the added listeners (handy property EventListenerList was removed from DOM3 spec proposal). Run this code before any event is attached:

    (function() {
      Element.prototype._addEventListener = Element.prototype.addEventListener;
      Element.prototype.addEventListener = function(a,b,c) {
        this._addEventListener(a,b,c);
        if(!this.eventListenerList) this.eventListenerList = {};
        if(!this.eventListenerList[a]) this.eventListenerList[a] = [];
        this.eventListenerList[a].push(b);
      };
    })();
    

    Read all the events by:

    var clicks = someElement.eventListenerList.click;
    if(clicks) clicks.forEach(function(f) {
      alert("I listen to this function: "+f.toString());
    });
    

    And don't forget to override Element.removeEventListener to remove the event from the custom Element.eventListenerList.

    3: the Element.onclick property needs special care here:

    if(someElement.onclick)
      alert("I also listen tho this: "+someElement.onclick.toString());
    

    4: don't forget the Element.onclick content attribute: these are two different things:

    someElement.onclick = someHandler; // IDL attribute
    someElement.setAttribute("onclick","otherHandler(event)"); // content attribute
    

    So you need to handle it, too:

    var click = someElement.getAttribute("onclick");
    if(click) alert("I even listen to this: "+click);
    

    The Visual Event bookmarklet (mentioned in the most popular answer) only steals the custom library handler cache:

    It turns out that there is no standard method provided by the W3C recommended DOM interface to find out what event listeners are attached to a particular element. While this may appear to be an oversight, there was a proposal to include a property called eventListenerList to the level 3 DOM specification, but was unfortunately been removed in later drafts. As such we are forced to looked at the individual Javascript libraries, which typically maintain a cache of attached events (so they can later be removed and perform other useful abstractions).

    As such, in order for Visual Event to show events, it must be able to parse the event information out of a Javascript library.

    Element overriding may be questionable (i.e. because there are some DOM specific features like live collections, which can not be coded in JS), but it gives the eventListenerList support natively and it works in Chrome, Firefox and Opera (doesn't work in IE7).

提交回复
热议问题