Pointer events
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2020.
* Some parts of this feature may have varying levels of support.
Ein Großteil des heutigen Webinhalts geht davon aus, dass das Zeigegerät des Benutzers eine Maus ist. Da jedoch viele Geräte andere Arten von Zeigeeingabegeräten unterstützen, wie z.B. Stift/Stylus und Touch-Oberflächen, sind Erweiterungen der vorhandenen Zeigegeräte-Ereignismodelle erforderlich. Pointer Events adressieren dieses Bedürfnis.
Pointer Events sind DOM-Ereignisse, die für ein Zeigegerät ausgelöst werden. Sie wurden entwickelt, um ein einzelnes DOM-Ereignismodell zu schaffen, um Zeigegeräte wie Maus, Stift/Stylus oder Touch (wie ein oder mehrere Finger) zu handhaben.
Der Pointer ist ein hardware-unabhängiges Gerät, das auf einen bestimmten Satz von Bildschirmkoordinaten abzielen kann. Ein einzelnes Ereignismodell für Pointer zu haben, kann die Erstellung von Websites und Anwendungen vereinfachen und eine gute Benutzererfahrung unabhängig von der Hardware des Benutzers bieten. Für Szenarien, in denen eine gerätespezifische Behandlung erwünscht ist, definiert Pointer Events eine pointerType
-Eigenschaft, um den Gerätetyp zu überprüfen, der das Ereignis verursacht hat.
Die für die Handhabung allgemeiner Zeigereingaben erforderlichen Ereignisse sind analog zu den Mouse Events (mousedown
/pointerdown
, mousemove
/pointermove
, etc.). Folglich sind Pointer Event-Typen absichtlich ähnlich zu den Mouse Event-Typen.
Darüber hinaus enthält ein Pointer Event die üblichen Eigenschaften, die in Mouse Events vorhanden sind (Client-Koordinaten, Ziel-Element, Button-Zustände, etc.) sowie neue Eigenschaften für andere Eingabeformen: Druck, Kontaktgeometrie, Neigung, etc. Tatsächlich erbt das PointerEvent
-Interface alle Eigenschaften des MouseEvent
und erleichtert so die Migration von Inhalten von Mouse Events zu Pointer Events.
Terminologie
Zustand der aktiven Buttons
Die Bedingung, wenn ein Pointer einen Wert ungleich null für die buttons
-Eigenschaft hat. Zum Beispiel im Fall eines Stifts, wenn der Stift physischen Kontakt zum Digitalisierer hat oder mindestens ein Knopf gedrückt ist, während man hovert.
Aktiver Pointer
Jedes Eingabegerät, das Ereignisse erzeugen kann. Ein Pointer gilt als aktiv, wenn er noch weitere Ereignisse erzeugen kann. Zum Beispiel gilt ein Stift im heruntergeklappten Zustand als aktiv, da er weitere Ereignisse erzeugen kann, wenn der Stift angehoben oder bewegt wird.
Digitalisierer
Ein Erfassungsgerät mit einer Oberfläche, die Kontakt erkennen kann. Meistens ist das Erfassungsgerät ein Touch-fähiger Bildschirm, der Eingaben von einem Eingabegerät wie einem Stift, Stylus oder Finger erkennen kann. Einige Erfassungsgeräte können die nahe Nähe des Eingabegeräts erkennen, und der Zustand wird als Hover im Sinne der Maus ausgedrückt.
Hit-Test
Der Prozess, den der Browser verwendet, um ein Ziel-Element für ein Pointer Event zu bestimmen. Typischerweise wird dies bestimmt, indem die Position des Pointers und auch das visuelle Layout von Elementen in einem Dokument auf Bildschirmmedien berücksichtigt wird.
Pointer
Eine hardware-unabhängige Darstellung von Eingabegeräten, die auf eine bestimmte Koordinate (oder einen Satz von Koordinaten) auf einem Bildschirm abzielen können. Beispiele für Pointer-Eingabegeräte sind Maus, Stift/Stylus und Touch Kontakte.
Pointer Capture
Pointer Capture erlaubt es, die Ereignisse für einen Pointer auf ein bestimmtes Element umzulenken, abweichend vom normalen Hit-Test-Ergebnis der Pointer-Position. Siehe Erfassung des Pointers für ein Beispiel.
Hinweis:>Pointer Capture ist anders als Pointer Lock, das den Pointer physisch daran hindert, eine Region zu verlassen.
Pointer Event
Schnittstellen
Die hauptsächliche Schnittstelle ist die PointerEvent
-Schnittstelle, die einen constructor
plus mehrere Ereignistypen und zugehörige globale Ereignishandler hat.
Der Standard umfasst außerdem einige Erweiterungen für die Element
- und Navigator
-Schnittstellen.
Die folgenden Unterabschnitte enthalten kurze Beschreibungen jeder Schnittstelle und ihrer Eigenschaften.
PointerEvent-Schnittstelle
Die PointerEvent
-Schnittstelle erweitert die MouseEvent
-Schnittstelle und hat folgende Eigenschaften.
altitudeAngle
Schreibgeschützt-
Repräsentiert den Winkel zwischen einer Wandlerebene (einem Zeiger oder Stylus) und der X-Y-Ebene eines Geräts.
azimuthAngle
Schreibgeschützt-
Repräsentiert den Winkel zwischen der Y-Z-Ebene und der Ebene, die sowohl die Wandlerachse als auch die Y-Achse enthält.
PointerEvent.persistentDeviceId
Schreibgeschützt-
Eine eindeutige Kennung für das Zeigegerät, das das
PointerEvent
erzeugt. pointerId
Schreibgeschützt-
Eine eindeutige Kennung für den Zeiger, der das Ereignis verursacht.
width
Schreibgeschützt-
Die Breite (Magnitude auf der X-Achse), in CSS-Pixeln, der Kontaktgeometrie des Pointers.
height
Schreibgeschützt-
Die Höhe (Magnitude auf der Y-Achse), in CSS-Pixeln, der Kontaktgeometrie des Pointers.
pressure
Schreibgeschützt-
Der normalisierte Druck der Zeigereingabe im Bereich von
0
bis1
, wobei0
und1
den minimalen und maximalen Druck darstellen, den die Hardware erfassen kann. tangentialPressure
Schreibgeschützt-
Der normalisierte tangentiale Druck der Zeigereingabe (auch bekannt als Fassdruck oder Zylinderstress) im Bereich von
-1
bis1
, wobei0
die neutrale Position der Steuerung ist. tiltX
Schreibgeschützt-
Der Ebenenwinkel (in Grad, im Bereich von
-90
bis90
) zwischen der Y-Z-Ebene und der Ebene, die sowohl die Wandlerachse als auch die Y-Achse enthält. tiltY
Schreibgeschützt-
Der Ebenenwinkel (in Grad, im Bereich von
-90
bis90
) zwischen der X-Z-Ebene und der Ebene, die sowohl die Wandlerachse als auch die X-Achse enthält. twist
Schreibgeschützt-
Die Drehung des Pointers (z.B. Stift-Stylus) um seine Hauptachse im Uhrzeigersinn in Grad, mit einem Wert im Bereich von
0
bis359
. pointerType
Schreibgeschützt-
Gibt den Gerätetyp an, der das Ereignis verursacht hat (Maus, Stift, Touch, etc.).
isPrimary
Schreibgeschützt-
Gibt an, ob der Pointer den primären Zeiger dieses Zeigertyps darstellt.
Ereignistypen und globale Ereignishandler
Pointer Events haben zehn Ereignistypen, sieben davon haben ähnliche Semantik wie ihre Maus-Ereignis-Pendants (down
, up
, move
, over
, out
, enter
, und leave
).
Nachfolgend ist eine kurze Beschreibung jedes Ereignistyps.
Ereignis | Beschreibung |
---|---|
pointerover |
Wird ausgelöst, wenn ein Pointer in die Hit-Test-Grenzen eines Elements bewegt wird. |
pointerenter |
Wird ausgelöst, wenn ein Zeiger in die Hit-Test-Grenzen eines Elements oder eines seiner Nachkommen verschoben wird, einschließlich als Ergebnis eines pointerdown -Ereignisses von einem Gerät, das Hover nicht unterstützt (siehe pointerdown ). |
pointerdown |
Wird ausgelöst, wenn ein Zeiger in den Zustand der aktiven Buttons wechselt. |
pointermove |
Wird ausgelöst, wenn ein Zeiger die Koordinaten ändert. Dieses Ereignis wird auch verwendet, wenn die Änderung des Zeigerzustands nicht durch andere Ereignisse gemeldet werden kann. |
pointerup |
Wird ausgelöst, wenn ein Zeiger nicht mehr im Zustand der aktiven Buttons ist. |
pointercancel |
Ein Browser löst dieses Ereignis aus, wenn er feststellt, dass der Zeiger keine Ereignisse mehr erzeugen kann (zum Beispiel, wenn das zugehörige Gerät deaktiviert wird oder der Browser entschieden hat, die Interaktion als Pan/Zoom zu interpretieren). Informationen zur Steuerung dieses Verhaltens finden Sie im Abschnitt zur CSS-Eigenschaft touch-action unten. |
pointerout |
Wird aus verschiedenen Gründen ausgelöst, einschließlich: Zeiger wird aus den Hit-Test-Grenzen eines Elements bewegt; Auslösen des pointerup-Ereignisses für ein Gerät, das Hover nicht unterstützt (siehe pointerup); nach dem Auslösen des pointercancel-Ereignisses (siehe pointercancel); wenn ein Stift-Stylus den Hover-Bereich des Digitalisierers verlässt. |
pointerleave |
Wird ausgelöst, wenn ein Zeiger aus den Hit-Test-Grenzen eines Elements bewegt wird. Für Stiftgeräte wird dieses Ereignis ausgelöst, wenn der Stylus den Hover-Bereich des Digitalisierers verlässt. |
pointerrawupdate
Experimentell
|
Wird ausgelöst, wenn ein Zeiger Eigenschaften ändert, die keine pointerdown - oder pointerup -Ereignisse auslösen. |
gotpointercapture |
Wird ausgelöst, wenn ein Element Pointer Capture erhält. |
lostpointercapture |
Wird ausgelöst, nachdem Pointer Capture für einen Pointer freigegeben wurde. |
Element-Erweiterungen
Es gibt drei Erweiterungen der Element
-Schnittstelle:
hasPointerCapture()
-
Gibt an, ob das aufgerufene Element Pointer Capture für den durch die gegebene Zeiger-ID identifizierten Zeiger hat.
releasePointerCapture()
-
Gibt die zuvor für ein bestimmtes Zeigerereignis gesetzte Pointer Capture frei (stoppt).
setPointerCapture()
-
Bestimmt ein bestimmtes Element als Capture-Ziel zukünftiger Zeigerereignisse.
Navigator-Erweiterung
Die Eigenschaft Navigator.maxTouchPoints
wird verwendet, um die maximale Anzahl gleichzeitiger Berührungspunkte zu bestimmen, die zu einem bestimmten Zeitpunkt unterstützt werden.
Beispiele
Dieser Abschnitt enthält Beispiele für die grundlegende Verwendung der Pointer-Events-Schnittstellen.
Registrierung von Ereignishandlern
Dieses Beispiel registriert einen Handler für jeden Ereignistyp für das gegebene Element.
<div id="target">Touch me…</div>
function over_handler(event) {}
function enter_handler(event) {}
function down_handler(event) {}
function move_handler(event) {}
function up_handler(event) {}
function cancel_handler(event) {}
function out_handler(event) {}
function leave_handler(event) {}
function rawUpdate_handler(event) {}
function gotCapture_handler(event) {}
function lostCapture_handler(event) {}
function init() {
const el = document.getElementById("target");
// Register pointer event handlers
el.onpointerover = over_handler;
el.onpointerenter = enter_handler;
el.onpointerdown = down_handler;
el.onpointermove = move_handler;
el.onpointerup = up_handler;
el.onpointercancel = cancel_handler;
el.onpointerout = out_handler;
el.onpointerleave = leave_handler;
el.onpointerrawupdate = rawUpdate_handler;
el.ongotpointercapture = gotCapture_handler;
el.onlostpointercapture = lostCapture_handler;
}
document.addEventListener("DOMContentLoaded", init);
Ereigniseigenschaften
Dieses Beispiel zeigt das Zugreifen auf alle Eigenschaften eines Pointer Events.
<div id="target">Touch me…</div>
const id = -1;
function process_id(event) {
// Process this event based on the event's identifier
}
function process_mouse(event) {
// Process the mouse pointer event
}
function process_pen(event) {
// Process the pen pointer event
}
function process_touch(event) {
// Process the touch pointer event
}
function process_tilt(tiltX, tiltY) {
// Tilt data handler
}
function process_pressure(pressure) {
// Pressure handler
}
function process_non_primary(event) {
// Non primary handler
}
function down_handler(ev) {
// Calculate the touch point's contact area
const area = ev.width * ev.height;
// Compare cached id with this event's id and process accordingly
if (id === ev.identifier) process_id(ev);
// Call the appropriate pointer type handler
switch (ev.pointerType) {
case "mouse":
process_mouse(ev);
break;
case "pen":
process_pen(ev);
break;
case "touch":
process_touch(ev);
break;
default:
console.log(`pointerType ${ev.pointerType} is not supported`);
}
// Call the tilt handler
if (ev.tiltX !== 0 && ev.tiltY !== 0) process_tilt(ev.tiltX, ev.tiltY);
// Call the pressure handler
process_pressure(ev.pressure);
// If this event is not primary, call the non primary handler
if (!ev.isPrimary) process_non_primary(ev);
}
function init() {
const el = document.getElementById("target");
// Register pointerdown handler
el.onpointerdown = down_handler;
}
document.addEventListener("DOMContentLoaded", init);
Bestimmen des primären Zeigers
In einigen Szenarien kann es mehrere Zeiger geben (zum Beispiel ein Gerät mit Touchscreen und Maus) oder ein Zeiger, der mehrere Kontaktpunkte unterstützt (zum Beispiel ein Touchscreen, der mehrere Fingerberührungen unterstützt). Die Anwendung kann die isPrimary
-Eigenschaft verwenden, um einen Hauptzeiger aus der Menge der aktiven Zeiger für jeden Zeigertyp zu identifizieren. Wenn eine Anwendung nur einen primären Zeiger unterstützen möchte, kann sie alle Zeigerereignisse ignorieren, die nicht primär sind.
Eine Maus hat nur einen Zeiger, sodass sie immer der primäre Zeiger sein wird. Für Touch-Eingaben gilt ein Zeiger als primär, wenn der Benutzer den Bildschirm berührt hat, während keine anderen aktiven Berührungen vorhanden waren. Bei Stift- und Stylus-Eingaben gilt ein Zeiger als primär, wenn der Stift des Benutzers den Bildschirm zuerst berührt hat, während keine anderen aktiven Stifte den Bildschirm berührten.
Bestimmen der Button-Zustände
Einige Zeigegeräte (wie Maus und Stift) unterstützen mehrere Knöpfe, und die Knopfdrücke können akkordiert sein (d.h. das Drücken eines zusätzlichen Knopfes, während ein anderer Knopf des Zeigegeräts bereits gedrückt ist).
Um den Zustand der Knopfdrücke zu bestimmen, verwenden Pointer Events die button
- und buttons
-Eigenschaften des MouseEvent
-Interfaces, von dem PointerEvent
erbt.
Die folgende Tabelle gibt die Werte von button
und buttons
für die verschiedenen Knopfzustände des Geräts an.
Gerätetasten-Zustand | button | buttons |
---|---|---|
Weder Knöpfe noch Berührungs-/Stiftkontakt haben sich seit dem letzten Ereignis geändert | -1 |
— |
Mausbewegung ohne gedrückte Knöpfe, Stift bewegt sich beim Hovern ohne gedrückte Knöpfe | — | 0 |
Linke Maus, Berührungskontakt, Stiftkontakt | 0 |
1 |
Mittlere Maus | 1 |
4 |
Rechte Maus, Stift-Fasses-Knopf | 2 |
2 |
Maus X1 (zurück) | 3 |
8 |
Maus X2 (vorwärts) | 4 |
16 |
Stift-Radiergummi-Knopf | 5 |
32 |
Hinweis:
Die button
-Eigenschaft gibt eine Änderung im Zustand des Knopfes an. Wie im Fall von Touch, wenn mehrere Ereignisse mit einem Ereignis auftreten, haben alle denselben Wert.
Erfassen des Pointers
Pointer Capture ermöglicht es den Ereignissen für ein bestimmtes Pointer Event, auf ein bestimmtes Element umgeleitet zu werden, anstatt dem normalen Hit-Test bei der Zeigerposition. Dies kann verwendet werden, um sicherzustellen, dass ein Element weiterhin Zeigerereignisse erhält, selbst wenn der Kontakt des Zeigegeräts das Element verlässt (beispielsweise durch Scrollen oder Ziehen).
Pointer Capture sorgt dafür, dass das Ziel alle nachfolgenden Zeigerereignisse so erfasst, als ob sie über dem erfassten Ziel stattfinden würden. Dementsprechend werden pointerover
, pointerenter
, pointerleave
und pointerout
nicht ausgelöst, solange diese Erfassung eingestellt ist. Für Touchscreen-Browser, die direkte Manipulation unterstützen, wird eine implizite Zeigererfassung auf dem Element aufgerufen, wenn ein pointerdown
-Ereignis ausgelöst wird. Die Erfassung kann manuell durch den Aufruf von element.releasePointerCapture
am Ziel-Element freigegeben werden oder sie wird implizit nach einem pointerup
- oder pointercancel
-Ereignis freigegeben.
Hinweis:
Wenn Sie ein Element im DOM verschieben müssen, dann stellen Sie sicher, dass Sie setPointerCapture()
nach den DOM-Bewegungen aufrufen, sodass setPointerCapture()
nicht den Überblick darüber verliert. Beispielsweise, wenn Sie Element.append()
verwenden müssen, um ein Element woanders hin zu verschieben, dann stellen Sie sicher, dass Sie setPointerCapture()
darauf nur nach dem Aufruf von Element.append()
aufrufen.
Das folgende Beispiel zeigt die Zeigererfassung, die auf ein Element eingestellt wird.
<div id="target">Touch me…</div>
function downHandler(ev) {
const el = document.getElementById("target");
// Element 'target' will receive/capture further events
el.setPointerCapture(ev.pointerId);
}
function init() {
const el = document.getElementById("target");
el.onpointerdown = downHandler;
}
document.addEventListener("DOMContentLoaded", init);
Das folgende Beispiel zeigt die Freigabe einer Zeigererfassung (wenn ein pointercancel
Ereignis auftritt. Der Browser führt dies automatisch aus, wenn ein pointerup
oder pointercancel
Ereignis auftritt.
<div id="target">Touch me…</div>
function downHandler(ev) {
const el = document.getElementById("target");
// Element "target" will receive/capture further events
el.setPointerCapture(ev.pointerId);
}
function cancelHandler(ev) {
const el = document.getElementById("target");
// Release the pointer capture
el.releasePointerCapture(ev.pointerId);
}
function init() {
const el = document.getElementById("target");
// Register pointerdown and pointercancel handlers
el.onpointerdown = downHandler;
el.onpointercancel = cancelHandler;
}
document.addEventListener("DOMContentLoaded", init);
CSS-Eigenschaft touch-action
Die touch-action
CSS-Eigenschaft wird verwendet, um festzulegen, ob der Browser sein Standard-(natürliches) Touch-Verhalten (wie Zoomen oder Scrollen) in einem Bereich anwenden soll oder nicht. Diese Eigenschaft kann auf alle Elemente angewendet werden, außer: nicht ersetzte Inline-Elemente, Tabellenzeilen, Zeilengruppen, Tabellenspalten und Spaltengruppen.
Ein Wert von auto
bedeutet, dass der Browser sein Standard-Touch-Verhalten (auf den angegebenen Bereich) frei anwenden kann, und der Wert none
deaktiviert das Standard-Touch-Verhalten des Browsers für den Bereich. Die Werte pan-x
und pan-y
bedeuten, dass Berührungen, die auf dem angegebenen Bereich beginnen, nur für das horizontale bzw. vertikale Scrollen gelten. Der Wert manipulation
bedeutet, dass der Browser Berührungen, die auf dem Element beginnen, nur für das Scrollen und Zoomen berücksichtigen kann.
Im folgenden Beispiel wird das Standard-Touch-Verhalten für einige button
-Elemente deaktiviert.
button#tiny {
touch-action: none;
}
Im folgenden Beispiel wird, wenn das target
-Element berührt wird, nur in horizontaler Richtung gescrollt.
#target {
touch-action: pan-x;
}
Kompatibilität mit Mausereignissen
Obwohl die Pointer Event-Schnittstellen es Anwendungen ermöglichen, verbesserte Benutzererfahrungen auf zeigerfähigen Geräten zu schaffen, ist die Realität, dass der Großteil der heutigen Webinhalte nur für die Arbeit mit Mausteingaben ausgelegt ist. Folglich muss der Browser, selbst wenn er Pointer Events unterstützt, dennoch Mausereignisse verarbeiten, sodass Inhalte, die nur auf Maus-Eingaben ausgelegt sind, unverändert funktionieren. Idealerweise muss eine zeigerfähige Anwendung Mausinhalte nicht explizit handhaben. Da der Browser jedoch Mausereignisse verarbeiten muss, kann es einige Kompatibilitätsprobleme geben, die behandelt werden müssen. Dieser Abschnitt enthält Informationen zur Interaktion von Pointer- und Mausereignissen und den Konsequenzen für Anwendungsentwickler.
Der Browser kann allgemeine Pointer-Eingaben in Mausereignisse für die Kompatibilität mit Maus-basierten Inhalten umsetzen. Diese Umsetzung von Ereignissen wird als Kompatibilitäts-Mausereignisse bezeichnet. Autoren können die Erzeugung bestimmter Kompatibilitäts-Mausereignisse verhindern, indem sie das pointerdown-Ereignis abbrechen, beachten Sie jedoch, dass:
- Mausereignisse können nur verhindert werden, wenn der Zeiger gedrückt ist.
- Hovernde Zeiger (z.B. eine Maus ohne gedrückte Knöpfe) können ihre Mausereignisse nicht verhindert haben.
- Die Ereignisse
mouseover
,mouseout
,mouseenter
undmouseleave
werden niemals verhindert (selbst wenn der Zeiger gedrückt ist).
Best Practices
Hier sind einige Best Practices zu beachten, wenn Sie Pointer Events verwenden:
- Minimieren Sie die Menge an Arbeit, die in Ereignishandlern ausgeführt wird.
- Fügen Sie die Ereignishandler einem spezifischen Ziel-Element hinzu (anstatt dem gesamten Dokument oder Knoten, die weiter oben im Dokumentbaum stehen).
- Das Ziel-Element (der Knoten) sollte groß genug sein, um die größte Kontaktflächen zu beherbergen (typischerweise eine Fingerberührung). Wenn das Zielgebiet zu klein ist, könnte das Berühren dazu führen, dass andere Ereignisse für benachbarte Elemente ausgelöst werden.
Spezifikationen
Specification |
---|
Pointer Events |
Browser-Kompatibilität
Einige zusätzliche Werte wurden für die CSS-Eigenschaft touch-action
als Teil der Pointer Events-Spezifikation definiert, aber derzeit haben diese Werte eine begrenzte Implementierungsunterstützung.