Możesz więc osiągnąć coś, czego chcesz w pewnych okolicznościach. W szczególności, jeśli
- Można załadować swój własny JavaScript przed pierwotnym
- wiedzieć, które elementy słuchania innych, by rzucać wydarzeń na
skutecznie, co możesz zrobić, to zastąpić oryginał Metoda addEventListener na elemencie docelowym z niestandardową, która przechwytuje wywołanie, wykonuje specjalne przetwarzanie, a następnie pozwala kontynuować za normalne. To "specjalne przetwarzanie" to nowa funkcja, która owija pierwotne wywołanie zwrotne i zaznacza pewne argumenty o zdarzeniach, aby poinformować cię, że ktoś już zaaranżował to wydarzenie. Oto dowód koncepcji (z jsFiddle)
docelowa 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);
})
W jaki sposób zdarzenia kliknięcia, które nie są kontrolowane, są powiązane? –
Nie mogę tak naprawdę wiedzieć, ponieważ jest to część biblioteki, która może być używana z różnymi rodzajami stron. Może to być addEventListener lub onXXX. – Grodriguez
Tak, 'addEventListener' sprawia, że jest trudniej. W przypadku typów on [event] możesz mieć to, aby twój przewodnik związany z dokumentem zaczynał od 'e.target' i przetestował go i jego przodków, aby zobaczyć, który z nich miał program obsługi, a następnie zawinął go funkcją, która wywołuje 'stopPropagation'. Ale 'addEventListener' nie pozwoli ci tego zrobić. –