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

前端 未结 19 2486
臣服心动
臣服心动 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:25

    It depends on how the events are attached. For illustration presume we have the following click handler:

    var handler = function() { alert('clicked!') };
    

    We're going to attach it to our element using different methods, some which allow inspection and some that don't.

    Method A) single event handler

    element.onclick = handler;
    // inspect
    alert(element.onclick); // alerts "function() { alert('clicked!') }"
    

    Method B) multiple event handlers

    if(element.addEventListener) { // DOM standard
        element.addEventListener('click', handler, false)
    } else if(element.attachEvent) { // IE
        element.attachEvent('onclick', handler)
    }
    // cannot inspect element to find handlers
    

    Method C): jQuery

    $(element).click(handler);
    
    • 1.3.x

       // inspect
       var clickEvents = $(element).data("events").click;
       jQuery.each(clickEvents, function(key, value) {
           alert(value) // alerts "function() { alert('clicked!') }"
       })
      
    • 1.4.x (stores the handler inside an object)

       // inspect
       var clickEvents = $(element).data("events").click;
       jQuery.each(clickEvents, function(key, handlerObj) {
           alert(handlerObj.handler) // alerts "function() { alert('clicked!') }"
           // also available: handlerObj.type, handlerObj.namespace
       })
      

    (See jQuery.fn.data and jQuery.data)

    Method D): Prototype (messy)

    $(element).observe('click', handler);
    
    • 1.5.x

       // inspect
       Event.observers.each(function(item) {
           if(item[0] == element) {
               alert(item[2]) // alerts "function() { alert('clicked!') }"
           }
       })
      
    • 1.6 to 1.6.0.3, inclusive (got very difficult here)

       // inspect. "_eventId" is for < 1.6.0.3 while 
       // "_prototypeEventID" was introduced in 1.6.0.3
       var clickEvents = Event.cache[element._eventId || (element._prototypeEventID || [])[0]].click;
       clickEvents.each(function(wrapper){
           alert(wrapper.handler) // alerts "function() { alert('clicked!') }"
       })
      
    • 1.6.1 (little better)

       // inspect
       var clickEvents = element.getStorage().get('prototype_event_registry').get('click');
       clickEvents.each(function(wrapper){
           alert(wrapper.handler) // alerts "function() { alert('clicked!') }"
       })
      
    • 1.7+ (very nice)

      Made using knowledge from this comment.

       events = $._data(this, 'events');
       for (type in events) {
         events[type].forEach(function (event) {
           console.log(event['handler']);
         });
       }
      

      When clicking the resulting output in the console (which shows the text of the function), the console will navigate directly to the line of the function's declaration in the relevant JS file.

提交回复
热议问题