2012-02-07 24 views
5

Actualmente estoy trabajando en un proyecto para mi universidad. Una cosa que tengo que hacer allí es sincronizar todos los gestores de eventos javascript registrados con el servidor. Es decir. Necesito saber qué elementos tienen un controlador de eventos en particular.JavaScript/jQuery: Escuche los controladores de eventos recién registrados

Ya uso VisualEvent para averiguar qué elementos tienen controladores de eventos y funciona realmente genial.

Pero lo que necesito es tener un detector de eventos que se llame cada vez que se registre un controlador de eventos para un elemento DOM.

Así que, básicamente, cada vez que se llama algo como $("#foo").click(...) o $("#foo").bind(...), necesito obtener la información de que se ha registrado un nuevo controlador de eventos para este elemento.

Viceversa Necesito un oyente cuando un controlador de eventos se elimina de un elemento DOM, pero esto no es obligatorio para el primer prototipo.

¿Hay alguna forma de adjuntar un controlador global a todos los registros de controladores de eventos?

Si necesita más información, no dude en comentar.

¡Gracias de antemano por cualquier ayuda!

Saludos, Robert

+1

¿Por qué la necesidad de servidor ¿saber? – zzzzBov

+0

Esto es parte de un proyecto de investigación para controlar remotamente un sitio web. Entonces el servidor necesita saber en qué elementos se puede hacer clic. –

+0

Estoy seguro de que hay una mejor manera de abordar el problema, pero no sé lo suficiente sobre el problema para darle un buen consejo. – zzzzBov

Respuesta

8

Si estás usando jQuery 1.7+, todos los métodos para fijar los acontecimientos pasan por jQuery.fn.on, por lo que es un simple caso de un exceso de montar esa función y va salvaje;

(function() { 

    var old = jQuery.fn.on; 

    jQuery.fn.on = function (events, selector, data, handler) { 
     // Ensure you still attach the events 
     var result = old.apply(this, arguments); 

     // Now do your own thing 

     // Inside here, `this` refers to the jQuery object on which `on` was invoked; 
     // it's not a specific element like it normally is within jQuery. You then 
     // therefore use something like `this.each(function() { /* this */ }); to 
     // target each element in the set. 

     // You might want to normalize the variables, as selector and data are optional, 
     // and events can be an object or string 
     jQuery.post('/spy.php', { 
      events: events, 
      selector: selector, 
      data: data 
     }, jQuery.noop); 

     return result; // keep the signature of `on`, and return the value `on()` *would* have done. 
    }; 

}()); 

Si estás usando jQuery < 1.7 y no se puede actualizar, se puede hacer algo similar al anterior, pero tendrá que anular bind(), live(), etc. delegate()

+2

Aunque todavía necesitaría algún método para identificar los elementos donde se adjuntó el evento. No estoy seguro de cómo podría funcionar, a menos que todos los elementos tengan una identificación única en el marcado. Si ese es el caso, podría usar algo como 'elements: this.map (function() {return this.id;}). Get(). Join (", ")' en la publicación. –

+0

Esto funciona perfectamente, ¡muchas gracias Matt y Dave! :) –

Cuestiones relacionadas