2012-05-07 16 views
5

Sto scrivendo uno script in cui vorrei gestire gli eventi del mouse solo se non sono stati gestiti da nessun altro elemento prima.Gestione degli eventi Javascript non gestiti da altri elementi

Posso associare un listener di eventi all'oggetto del documento, ma riceverà tutti gli eventi indipendentemente dal fatto che siano già stati gestiti.

Non ho controllo sugli elementi nella pagina HTML, quindi non posso arrestare manualmente Pripagation() quando viene gestito l'evento.

Qualche idea?

+1

Come vengono associati gli eventi di clic che non si controllano? –

+0

Non posso davvero sapere, dal momento che questo fa parte di una libreria che può essere utilizzata con diversi tipi di pagine. Potrebbe essere addEventListener o onXXX. – Grodriguez

+1

Sì, 'addEventListener' rende più difficile. Per i tipi on [evento], potresti averlo in modo che il tuo gestore legato al documento inizi con 'e.target', e testarlo e i suoi antenati per vedere quale ha il gestore, quindi avvolgerlo con una funzione che chiama 'stopPropagation'. Ma 'addEventListener' non ti permetterà di farlo. –

risposta

1

Da questo articolo here.

Sembra che non sia ancora possibile farlo.

Quali gestori di eventi sono registrati?

Un problema dell'attuale implementazione del modello di registrazione evento W3C è che non è possibile scoprire se alcuni gestori di eventi sono già registrati per un elemento. Nel modello tradizionale si potrebbe fare:

alert(element.onclick)

e si vede la funzione che ha registrato esso, o non definito se non è stato registrato. Solo nella sua recentissima DOM livello 3 eventi W3C aggiunge un

eventListenerList

per memorizzare un elenco di evento gestori che sono attualmente registrati su un elemento. Questa funzionalità non è ancora supportata da alcun browser, è troppo nuova. Tuttavia, il problema è stato risolto.

Fortunatamente

removeEventListener() 

non dà errori se l'evento ascoltatore che si desidera rimuovere non è stato aggiunto l'elemento, in modo che quando di dubbio si può sempre usare removeEventListener ().

+0

OK .. (anche se non ho davvero bisogno di un elenco di listener). Vediamo se riesco a trovare un altro modo. – Grodriguez

1

Quindi, è possibile realizzare qualcosa come si desidera in determinate circostanze. In particolare, se

  • è possibile caricare il proprio personalizzato JavaScript prima che l'originale
  • Sapete quali elementi si sta ascoltando per gli altri a gettare eventi su

In effetti, ciò che si fa è sostituire l'originale Il metodo addEventListener sull'elemento di destinazione con uno personalizzato che intercetta la chiamata, esegue alcune elaborazioni speciali e quindi lo consente di continuare normalmente. Questa "elaborazione speciale" è una nuova funzione che avvolge il callback originale e contrassegna gli argomenti dell'evento con un certo stato per informarti che qualcun altro ha già gestito l'evento. Ecco una prova di concetto (con un jsFiddle)

target HTML:

<div id='asdf'>asdf</div>​ 

JavaScript:

var target = document.getElementById('asdf'); 
var original = target.addEventListener; 

var updated = function(){ 
    // Grab the original callback, so we can use it in our wrapper 
    var originalFunc = arguments[1]; 

    // Create new function for the callback, that lets us set a state letting us know it has been handled by someone 
    // Finish the callback by executing the original callback 
    var newFunc = function(e){ 
     console.log('haha, intercepted you'); 
     e.intercepted = true; 
     originalFunc.call(this, e); 
    }; 

    // Set the new function in place in the original arguments 'array' 
    arguments[1] = newFunc; 

    // Perform the standard addEventListener logic with our new wrapper function 
    original.apply(this, arguments); 
}; 

// Set the addEventListener on our target to our modified version 
target.addEventListener = updated; 

// Standard event handling 
target.addEventListener('click', function(e){ 
    console.log('original click'); 
    console.log('intercepted?', e.intercepted); 
}) 
+0

Questa è un'idea interessante. Posso assicurarmi che il mio JS funzioni prima dell'originale. Tuttavia non ho modo di sapere quali elementi aggiungeranno un listener di eventi. C'è un modo per farlo, ma in modo globale? (Ad esempio, sostituendo globalmente il codice addEventListener con una versione modificata) – Grodriguez

Problemi correlati