Signatur
Beschreibung
Die schreibgeschützte Eigenschaft cancelable der Event-Schnittstelle zeigt an, ob sich ein Ereignis abbrechen lässt. Bei true kann ein Listener mit event.preventDefault() die Standardaktion des Browsers verhindern, zum Beispiel das Absenden eines Formulars, das Öffnen eines Links oder das Scrollen bei wheel- oder touchmove-Ereignissen.
Ob ein Ereignis abbrechbar ist, legt derjenige fest, der es erzeugt. Bei nativen Ereignissen entscheidet das die Spezifikation: click, submit und keydown sind abbrechbar, load, scroll und focus nicht. Bei eigenen Ereignissen bestimmt die Option cancelable im Konstruktor von Event oder CustomEvent den Wert. Standardmäßig ist er false.
In der Praxis prüft man cancelable vor dem Aufruf von preventDefault(). Das ist vor allem bei Ereignissen wichtig, die der Browser nur in manchen Situationen abbrechen lässt, etwa touchmove während eines laufenden Scrollvorgangs. Ist die Eigenschaft false, bewirkt preventDefault() nichts. Manche Browser geben dann eine Warnung in der Konsole aus.
Rückgabewert
true, wenn das Ereignis abgebrochen werden kann, sonst false.Beispiele
Scrollen per Mausrad nur verhindern, wenn es erlaubt ist
const box = document.querySelector('#zoom-box');
// passive: false ist nötig, sonst lässt sich wheel nicht abbrechen
box.addEventListener('wheel', (event) => {
if (event.cancelable) {
event.preventDefault();
console.log('Scrollen verhindert, stattdessen Zoom');
} else {
console.log('Ereignis nicht abbrechbar');
}
}, { passive: false });
Eigenes, abbrechbares Ereignis auslösen
const dialog = document.createElement('div');
dialog.addEventListener('beforeclose', (event) => {
console.log('cancelable:', event.cancelable);
// Schließen verhindern, z. B. bei ungespeicherten Änderungen
event.preventDefault();
});
const closeEvent = new CustomEvent('beforeclose', { cancelable: true });
// dispatchEvent gibt false zurück, wenn preventDefault() aufgerufen wurde
const darfSchliessen = dialog.dispatchEvent(closeEvent);
console.log('Schließen erlaubt:', darfSchliessen);
Standardwert bei eigenen Ereignissen
const e1 = new Event('ping');
const e2 = new Event('ping', { cancelable: true });
e1.preventDefault(); // bewirkt nichts
e2.preventDefault();
console.log(e1.cancelable, e1.defaultPrevented);
console.log(e2.cancelable, e2.defaultPrevented);
Native Ereignisse vergleichen
document.addEventListener('click', (e) => console.log('click:', e.cancelable));
window.addEventListener('scroll', (e) => console.log('scroll:', e.cancelable));
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
event.cancelable = truewird im nicht-strikten Modus stillschweigend ignoriert und löst im strikten Modus einenTypeErroraus. Der Wert lässt sich nur beim Erzeugen über die Konstruktor-Option festlegen. - Passive Listener: In Listenern mit
{ passive: true }wirdpreventDefault()ignoriert, auch wenncancelableden Werttruehat. Chrome und Firefox registrierentouchstart,touchmoveundwheelaufwindow,documentundbodystandardmäßig als passiv. - Nicht mit
defaultPreventedverwechseln:cancelablesagt, ob abgebrochen werden kann.defaultPreventedsagt, ob tatsächlich abgebrochen wurde. - Wert kann sich je nach Situation ändern: Bei Touch-Ereignissen setzt der Browser
cancelablewährend eines laufenden Scrollvorgangs auffalse. Deshalb sollte man den Wert jedes Mal prüfen, statt sich auf den Ereignistyp zu verlassen. - Nicht mit
stopPropagation()verwechseln:stopPropagation()hält die Weitergabe des Ereignisses an andere Elemente an und funktioniert unabhängig voncancelable. - Die Eigenschaft wird von allen modernen Browsern seit Langem unterstützt.