2012-02-07 15 views
5

Attualmente sto lavorando a un progetto per la mia università. Una cosa che devo fare è sincronizzare tutti gli javascript-eventhandler registrati con il server. Cioè Ho bisogno di sapere quali elementi hanno un particolare gestore di eventi.JavaScript/jQuery: ascolto per i gestori di eventi appena registrati

Io uso già VisualEvent per scoprire quali elementi hanno gestori di eventi e funziona davvero alla grande.

Ma la cosa di cui ho bisogno è avere un listener di eventi che viene chiamato ogni volta che un gestore di eventi viene registrato per un elemento DOM.

Quindi praticamente ogni volta che viene chiamato qualcosa come $("#foo").click(...) o $("#foo").bind(...), ho bisogno di ottenere le informazioni che un nuovo gestore di eventi è stato registrato per questo elemento.

Viceversa Ho bisogno di un listener quando un gestore di eventi viene rimosso da un elemento DOM, ma questo non è obbligatorio per il primo prototipo.

C'è un modo per associare un gestore globalmente a tutte le registrazioni di gestore eventi?

Se avete bisogno di ulteriori informazioni, non esitate a commentare.

Grazie in anticipo per qualsiasi aiuto!

Con i migliori saluti, Robert

+1

Perché il server necessario conoscere? – zzzzBov

+0

Questo fa parte di un progetto di ricerca per il controllo remoto di un sito web. Quindi il server deve sapere quali elementi sono cliccabili. –

+0

Sono certo che c'è un modo migliore per affrontare il problema, ma non conosco abbastanza il problema per darti un buon consiglio. – zzzzBov

risposta

8

Se stai usando jQuery 1.7+, tutti i metodi per fissare gli eventi passano attraverso jQuery.fn.on, quindi è un semplice caso di over-riding quella funzione e andando selvatici;

(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. 
    }; 

}()); 

Se stai usando jQuery < 1.7 e non è possibile aggiornare, si può fare qualcosa di simile al precedente, ma dovrà ignorare bind(), live(), delegate() ecc

+2

Sebbene sia ancora necessario un metodo per identificare gli elementi in cui è stato collegato l'evento. Non sei sicuro di come possa funzionare, a meno che ogni elemento non abbia un ID univoco nel markup. Se questo è il caso, potresti usare qualcosa come 'elements: this.map (function() {return this.id;}). Get(). Join (", ")' nel post. –

+0

Funziona perfettamente, grazie mille Matt e Dave! :) –

Problemi correlati