Signatur
Beschreibung
hasPointerCapture() gibt true zurück, wenn das Element, auf dem die Methode aufgerufen wird, die Zeigererfassung (englisch pointer capture) für den Zeiger mit der angegebenen ID hat. Das ist z. B. nach einem Aufruf von setPointerCapture() der Fall. Solange die Erfassung besteht, gehen alle Zeiger-Ereignisse dieses Zeigers (pointermove, pointerup usw.) an dieses Element, auch wenn sich Maus, Stift oder Finger längst außerhalb des Elements befinden. (Die MDN-Übersetzung „Zeigerdämpfung“ ist irreführend. Gemeint ist die Erfassung.)
Gebraucht wird die Methode vor allem bei eigenen Drag-Interaktionen wie Schiebereglern, Zeichenflächen, verschiebbaren Fenstern oder Größenanfassern. Damit lässt sich prüfen, ob gerade ein Ziehvorgang läuft, ob man die Erfassung vor dem Freigeben noch hat oder ob der Browser sie schon selbst beendet hat.
Die pointerId kommt aus der Eigenschaft PointerEvent.pointerId des jeweiligen Ereignisses. Jeder aktive Zeiger (jeder Finger bei Multitouch, jeder Stift, die Maus) hat eine eigene ID. Deshalb wird die Erfassung auch für jeden Zeiger getrennt verwaltet.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $pointerId Pflicht | number | Die ID des Zeigers, meist aus event.pointerId eines PointerEvent. |
Rückgabewert
true, wenn das Element die Erfassung für diesen Zeiger hat, sonst false. Bei einer unbekannten oder ungültigen ID wird false zurückgegeben und kein Fehler geworfen.Beispiele
Erfassung setzen und prüfen
const box = document.querySelector('#box');
box.addEventListener('pointerdown', (event) => {
console.log('vorher:', box.hasPointerCapture(event.pointerId));
box.setPointerCapture(event.pointerId);
console.log('nachher:', box.hasPointerCapture(event.pointerId));
});
Schieberegler: nur ziehen, solange die Erfassung besteht
const thumb = document.querySelector('.slider-thumb');
const track = thumb.parentElement;
thumb.addEventListener('pointerdown', (e) => {
thumb.setPointerCapture(e.pointerId);
});
thumb.addEventListener('pointermove', (e) => {
// Nur reagieren, wenn gerade gezogen wird
if (!thumb.hasPointerCapture(e.pointerId)) return;
const rect = track.getBoundingClientRect();
const ratio = Math.min(Math.max((e.clientX - rect.left) / rect.width, 0), 1);
thumb.style.left = `${ratio * 100}%`;
});
thumb.addEventListener('pointerup', (e) => {
if (thumb.hasPointerCapture(e.pointerId)) {
thumb.releasePointerCapture(e.pointerId);
}
});
Erfassung mit der Escape-Taste sicher abbrechen
const canvas = document.querySelector('canvas');
let activePointer = null;
canvas.addEventListener('pointerdown', (e) => {
activePointer = e.pointerId;
canvas.setPointerCapture(e.pointerId);
});
canvas.addEventListener('lostpointercapture', () => {
activePointer = null;
console.log('Erfassung beendet');
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && activePointer !== null &&
canvas.hasPointerCapture(activePointer)) {
canvas.releasePointerCapture(activePointer);
}
});
// Wichtig · Fallstricke
- Implizite Erfassung bei Touch: Viele Browser erfassen Touch-Zeiger bei
pointerdownautomatisch für das Ziel-Element. Dann lieferthasPointerCapture()dort schontrue, ohne dasssetPointerCapture()aufgerufen wurde. Bei der Maus ist das nicht so. - Automatisches Freigeben: Nach
pointerupoderpointercancelgibt der Browser die Erfassung selbst frei und löstlostpointercaptureaus. Das passiert auch, wenn das Element aus dem DOM entfernt wird. Danach liefert die Methodefalse. Aufräumarbeiten gehören deshalb besser inlostpointercaptureals inpointerup. - Sofortiger Status: Direkt nach
setPointerCapture()gibt die Methode schontruezurück. Das Ereignisgotpointercapturekommt aber erst vor dem nächsten Zeiger-Ereignis. - Anders als
setPointerCapture()undreleasePointerCapture()wirft die Methode bei einer ungültigenpointerIdkeinenNotFoundError. - Funktioniert nur mit Pointer Events, nicht mit den alten
mouse- odertouch-Ereignissen. In allen aktuellen Browsern verfügbar, im Internet Explorer nicht (dort gab es nurmsSetPointerCapturemit Präfix).