Funzione periodo solo se di default evento è / non è impedito
-
28-09-2019 - |
Domanda
C'è un modo per eseguire una funzione solo se event.preventDefault () viene chiamato su un evento (da un'altra funzione ignota). Questo è per un plugin jQuery, quindi non ho alcuna conoscenza di ciò che altre parti della pagina potrebbe fare. Ho provato questo:
Event.test = Event.preventDefault;
Event.preventDefault = function () {
alert('Success');
this.test();
}
ma non funziona ... solo si comporta come normale, senza errori.
Al contrario, voglio il contrario troppo ... per chiamare una funzione solo se event.preventDefault () non viene chiamato. In effetti, per aggiungere una funzione per l'azione predefinita per un evento. Qualche idea? È tutto questo a tutto il possibile?
Modifica: Sulla base del commento, ho una soluzione al primo problema: http: / /jsfiddle.net/nathan/VAePB/9/ . Funziona in Chrome (avvisi function preventDefault() { [native code] }
, ma IE avvisi undefined
. Così IE non mi permette di definire Event.prototype.test, ma mi permette di ridefinire Event.prototype.preventDefault. Strano. Sono sicuro che posso venire con una soluzione al problema del secondo sulla base di questo se posso solo farlo funzionare in IE.
Soluzione
Per il primo problema, provare qualcosa di simile:
oldPreventDefault = Event.prototype.preventDefault;
Event.prototype.preventDefault = function() {
//do stuff
oldPreventDefault.call(this);
}
Non so se questo lavoro sarà, ma forse vale la pena un colpo.
Per il secondo problema, vorrei provare qualcosa di simile a gestione degli eventi dal vivo. Mettere un ascoltatore in un elemento padre (vale a dire body
o un div
di livello superiore). Se è possibile ottenere il vostro gancio in preventDefault
come detto prima, è possibile utilizzare che per impostare un flag. Se l'evento bolle fino a tale elemento e la vostra bandiera non è impostato, fare il vostro comportamento esteso. Anche se questo non funziona con tutti gli eventi, dal momento che non tutti gli eventi bolla. Un altro modo per affrontare questo problema potrebbe essere quella di esecuzione ritardo fino alla pila corrente ha terminato di utilizzare setTimeout(0,...)
e quindi il controllo della bandiera.
Altri suggerimenti
Non sono sicuro di aver capito. Non puoi semplicemente usare event.isDefaultPrevented()
come questo