2012-01-28 19 views
68

ya he mirado a estas preguntas:Obtener detectores de eventos asociados al nodo mediante addEventListener

sin embargo ninguno de ellos respuestas cómo obtener una lista de detectores de eventos conectados a un nodo usando addEventListener, sin modificar el prototipo addEventListener antes de que el evento escuche son creados

VisualEvent no muestra todos los detectores de eventos (iphone específicos) y quiero hacer esto (algo) programáticamente.

+0

duplicado posible de [Cómo encontrar detectores de eventos en un DOM nodo al depurar o desde el código JS?] (http://stackoverflow.com/questions/446892/how-to-find-event-listeners-on-a-dom-node-when-debugging-or-from-the -js-code) – Nickolay

+0

"algo programáticamente" y el hecho de que [respuesta aceptada] (http://stackoverflow.com/a/15666321/1026) para esta pregunta es una función devtools hace que este sea un duplicado de la pregunta en la lista. Para aquellos que buscan una solución JS, [la respuesta es "no hay uno"] (http://stackoverflow.com/a/10030771/1026) – Nickolay

Respuesta

95

DevTools de Chrome, Safari Inspector y soporte Firebug getEventListeners(node).

getEventListeners(document)

+0

¿Funciona esto para los eventos 'orientationchange'? – JohnK

+2

Quiero señalar que el método getEventListeners no es compatible con la versión de Firefox 35. – MURATSPLAT

+0

Puede que no funcione en Firefox, pero de nuevo los desarrolladores se desarrollan en varios navegadores/Esto seguro AYUDA si se necesita modificar un sitio existente ... ¡MUCHO! – JasonXA

47

No puede.

La única manera de obtener una lista de todos los detectores de eventos asociados a un nodo es interceptar la llamada unión oyente.

DOM4 addEventListener

Dice

append un detector de eventos a la lista asociada de detectores de eventos con el tipo establecido para escribir, oyente establece en oyente, y la captura configurarse para capturar, a menos que ya es un evento oyente en esa lista con el mismo tipo, oyente y captura.

Significado de que un detector de eventos se agrega a la "lista de detectores de eventos". Eso es todo. No hay idea de lo que debería ser esta lista ni cómo debería accederla.

+7

Cualquier posibilidad de proporcionar alguna justificación o razonamiento de por qué debe funcionar esto ¿camino? Claramente, el navegador sabe lo que son todos los oyentes. – Fuser97381

+2

@ user973810: ¿Cómo quieres que justifique esto? La API DOM no proporciona ninguna forma de hacerlo y no hay formas no estándar de hacerlo en los navegadores actuales. En cuanto a por qué este es el caso, realmente no lo sé. Parece algo razonable querer hacer. –

+0

He visto algunos hilos sobre agregar una API al DOM para esto. – Raynos

1

Puede obtener todos los eventos de jQuery usando $ ._ datos ($ ('[Selector]') [0], 'eventos'); cambia [selector] a lo que necesitas.

hay un plugin que se reúnen todos los eventos unidos por jQuery llamados eventsReport.

También escribo mi propio plugin que hacer esto con un mejor formato.

Pero de todos modos parece que no podemos recopilar eventos añadidos por el método addEventListener. Puede ser que podamos envolver la llamada addEventListener para almacenar eventos agregados después de nuestra llamada de enlace.

Parece la mejor manera de ver eventos agregados a un elemento con herramientas de desarrollo.

Pero no verá eventos delegados allí. Entonces, necesitamos jQuery eventsReport.

ACTUALIZACIÓN: Ahora podemos ver los eventos añadidos por el método addEventListener VER respuesta correcta a esta pregunta.

+0

Esta es una interfaz privada y obsoleta, y puede desaparecer pronto, así que no confíe en eso. – mgol

+1

Sí, pero la vez que respondí, no había tal habilidad en las herramientas Dev. Entonces, no había nada para elegir. – Rantiev

+0

Está en desuso @Rantiev, ¿puedes eliminar esa respuesta? –

15

Dado que no hay forma nativa para hacer esto, aquí está la solución menos intrusiva que encontré (No añadir cualquiera de los métodos de prototipo 'viejos'):

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

Me gusta esta solución. Esto merece más votos favorables. – Ju66ernaut

+0

También debe hacerlo interceptar oyentes de eventos de ventana. ¡Aparte de eso, esto funciona genial! –

Cuestiones relacionadas