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);
})
Come vengono associati gli eventi di clic che non si controllano? –
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
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. –