Signatur
Beschreibung
Das Ereignis pointerdown gehört zur Pointer Events API. Es vereint Maus, Touch und Stift in einem einzigen Eingabemodell. Ausgelöst wird es, sobald ein Zeiger in den aktiven Zustand wechselt. Bei der Maus passiert das, wenn von „keine Taste gedrückt“ zu „mindestens eine Taste gedrückt“ gewechselt wird. Bei Touch ist es der Moment, in dem der Finger den Bildschirm berührt, beim Stift der Kontakt mit dem Digitizer.
Man registriert das Ereignis mit element.addEventListener("pointerdown", handler) oder über die Eigenschaft element.onpointerdown = handler. Der Handler bekommt ein PointerEvent. Es hat alle Eigenschaften eines MouseEvent (clientX, button, buttons …) und zusätzlich pointerId, pointerType ("mouse", "pen", "touch"), pressure, width/height, tiltX/tiltY und isPrimary.
Typische Einsatzfälle sind der Beginn von Drag-and-Drop-Interaktionen, Zeichenflächen, Schieberegler, Wischgesten oder eine sofortige visuelle Rückmeldung beim Antippen. Häufig kombiniert man es mit setPointerCapture(). Dann gehen die folgenden pointermove- und pointerup-Ereignisse weiter an dasselbe Element, auch wenn der Zeiger es verlässt.
Das Ereignis steigt im DOM auf (bubbles), lässt sich mit preventDefault() abbrechen und ist composed, überquert also Shadow-DOM-Grenzen. Nach pointerdown folgt normalerweise ein kompatibles mousedown. Dieses wird unterdrückt, wenn man im pointerdown-Handler preventDefault() aufruft.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Der Ereignisname "pointerdown". |
|
| $handler Pflicht | (event: PointerEvent) => void | Callback, der ein PointerEvent erhält. |
|
| $options | boolean | AddEventListenerOptions | false | Optionen wie capture, once, passive oder signal (zum Entfernen per AbortController). |
Rückgabewert
addEventListener gibt nichts zurück. Der Handler bekommt ein PointerEvent-Objekt.Beispiele
Zeigertyp und Position erkennen
const flaeche = document.querySelector('#flaeche');
flaeche.addEventListener('pointerdown', (event) => {
console.log(`Typ: ${event.pointerType}, ID: ${event.pointerId}`);
console.log(`Position: ${event.offsetX}/${event.offsetY}, Druck: ${event.pressure}`);
});
Element ziehen mit Pointer Capture
const box = document.querySelector('.box');
box.style.touchAction = 'none'; // Browser-Scrollen/Zoomen per Touch unterbinden
let start = null;
box.addEventListener('pointerdown', (event) => {
if (event.button !== 0) return; // nur Primärtaste
start = { x: event.clientX - box.offsetLeft, y: event.clientY - box.offsetTop };
box.setPointerCapture(event.pointerId);
});
box.addEventListener('pointermove', (event) => {
if (!start || !box.hasPointerCapture(event.pointerId)) return;
box.style.left = `${event.clientX - start.x}px`;
box.style.top = `${event.clientY - start.y}px`;
});
box.addEventListener('pointerup', () => { start = null; });
on-Property und Entfernen des Listeners
const button = document.querySelector('#aufnahme');
// Variante 1: on-Property (nur ein Handler möglich)
button.onpointerdown = () => console.log('Aufnahme startet');
// Handler wieder entfernen
button.onpointerdown = null;
// Variante 2: addEventListener + removeEventListener
const beiDruck = (event) => {
console.log('Gedrückt mit', event.pointerType);
button.removeEventListener('pointerdown', beiDruck); // nur einmal reagieren
};
button.addEventListener('pointerdown', beiDruck);
Multitouch: aktive Zeiger zählen
const aktiv = new Map();
const canvas = document.querySelector('canvas');
canvas.style.touchAction = 'none';
canvas.addEventListener('pointerdown', (e) => {
aktiv.set(e.pointerId, { x: e.clientX, y: e.clientY });
console.log(`Aktive Finger: ${aktiv.size}`);
});
const entfernen = (e) => aktiv.delete(e.pointerId);
canvas.addEventListener('pointerup', entfernen);
canvas.addEventListener('pointercancel', entfernen);
// Wichtig · Fallstricke
- Maus mit mehreren Tasten: Ist bereits eine Maustaste gedrückt und kommt eine zweite hinzu, gibt es kein weiteres
pointerdown, sondern einpointermovemit geänderter Eigenschaftbuttons.pointerdownkommt nur beim ersten Tastendruck. - Touch und
touch-action: Ohne die CSS-Eigenschafttouch-action: none(oderpan-yo. Ä.) kann der Browser eine Touch-Geste als Scrollen oder Zoomen übernehmen. Dann folgtpointercancel, und es kommen keine weiterenpointermove-Ereignisse mehr.preventDefault()inpointerdownverhindert das Scrollen nicht. - preventDefault: Unterdrückt die kompatiblen Mausereignisse (
mousedown,mouseup), aber nichtclick. Außerdem kann es Textauswahl und Fokuswechsel verhindern. - Aufräumen: Neben
pointerupimmer auchpointercancelbehandeln, sonst bleiben Zustände hängen, etwa ein Drag, der nie beendet wird. - Barrierefreiheit: Aktionen, die nur über
pointerdownausgelöst werden, erreicht man nicht per Tastatur. Für Schaltflächen istclickmeist die bessere Wahl. - Kompatibilität: Wird von allen modernen Browsern unterstützt (Safari seit 13). Ältere iOS-Versionen brauchen einen Fallback auf
touchstart.