Signatur
Beschreibung
UIEvent.which ist ein Überbleibsel aus der Zeit der Browserkriege. Die Eigenschaft sollte die Unterschiede zwischen keyCode, charCode und button ausgleichen und gibt deshalb je nach Event-Typ eine andere Zahl zurück.
- Bei
keydown/keyup: derselbe Wert wieKeyboardEvent.keyCode, also ein systemabhängiger Tastencode (z. B.13für Enter,65für A). - Bei
keypress: der Zeichencode (charCode) des erzeugten Zeichens, z. B.97für ein kleines „a“. - Bei Maus-Events:
0= keine Taste,1= links,2= Mitte,3= rechts. Das ist um eins verschoben gegenüberMouseEvent.button(0/1/2). - Bei allen anderen Events: in der Regel
0.
In neuem Code solltest du which nicht mehr verwenden. Für Tastatureingaben gibt es KeyboardEvent.key (das tatsächliche Zeichen bzw. den Tastennamen) und KeyboardEvent.code (die physische Taste). Für Maustasten nimmst du MouseEvent.button oder MouseEvent.buttons. Wichtig ist which eigentlich nur noch, wenn du alten Code pflegst, z. B. jQuery-basierte Handler, die sich auf event.which verlassen.
Rückgabewert
Beispiele
Altcode: Enter-Taste per which erkennen (und moderne Alternative)
const input = document.querySelector('#suche');
input.addEventListener('keydown', (event) => {
// Veraltet: numerischer Tastencode
if (event.which === 13) {
console.log('Enter (which):', event.which);
}
// Empfohlen: sprechender Tastenname
if (event.key === 'Enter') {
console.log('Enter (key):', event.key);
}
});
Maustaste bestimmen: which vs. button
document.addEventListener('mousedown', (event) => {
const namen = { 1: 'links', 2: 'Mitte', 3: 'rechts' };
console.log(`which=${event.which} (${namen[event.which]}), button=${event.button}`);
});
// Kontextmenü unterdrücken, damit Rechtsklicks sichtbar werden
document.addEventListener('contextmenu', (event) => event.preventDefault());
Migrations-Helfer für Legacy-Handler
// Gibt eine einheitliche Maustaste zurück (0 = links, 1 = Mitte, 2 = rechts)
const getMouseButton = (event) =>
typeof event.button === 'number' ? event.button : event.which - 1;
// Ersetzt alte which-Vergleiche bei Tastatur-Events durch key
const isEscape = (event) =>
event.key === 'Escape' || event.key === 'Esc' || event.which === 27;
document.addEventListener('keydown', (event) => {
if (isEscape(event)) console.log('Dialog schließen');
});
document.addEventListener('mouseup', (event) => {
console.log('Taste:', getMouseButton(event));
});
// Wichtig · Fallstricke
- Veraltet:
whichist nur aus Kompatibilitätsgründen noch spezifiziert. Nimm stattdessenKeyboardEvent.key/codebzw.MouseEvent.button/buttons. - Uneinheitliche Werte: Tastencodes hängen von Tastaturlayout, Betriebssystem und Browser ab. Bei
keydownliefertwhichz. B. für „a“ und „A“ beide Male65, beikeypressdagegen97bzw.65. - Versatz um eins: Bei der Maus ist
whichgleichbutton + 1. Das führt beim Umstellen leicht zu Fehlern. keypressist ebenfalls veraltet und wird für Nicht-Zeichen-Tasten (Pfeiltasten, Escape) teilweise gar nicht ausgelöst.- IME/Mobilgeräte: Bei Eingabemethoden (z. B. Android-Tastaturen, Eingabe mit Zeichen-Komposition) liefert
whichoft229oder0statt eines verwertbaren Codes. - Browser-Unterstützung: Chrome, Firefox, Safari und Edge unterstützen die Eigenschaft weiterhin. Sie kann aber langfristig entfernt werden.