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.

Vieler heutiger Webinhalt geht davon aus, dass das Zeigegerät des Benutzers eine Maus sein wird. Da jedoch viele Geräte andere Arten von Zeigereingabegeräten wie Stift/Stylus und Touch-Oberflächen unterstützen, sind Erweiterungen der vorhandenen Zeigegeräte-Ereignismodelle erforderlich. Pointer events adressieren dieses Bedürfnis.

Zeigerereignisse sind DOM-Ereignisse, die für ein Zeigegerät ausgelöst werden. Sie sind darauf ausgelegt, ein einzelnes DOM-Ereignismodell zu schaffen, um Zeigereingabegeräte wie Maus, Stift/Stylus oder Touch (wie zum Beispiel ein oder mehrere Finger) zu handhaben.

Der Zeiger ist ein hardware-unabhängiges Gerät, das auf einen bestimmten Satz von Bildschirmkoordinaten abzielen kann. Ein einziges Ereignismodell für Zeiger zu haben, kann die Erstellung von Websites und Anwendungen vereinfachen und ein gutes Benutzererlebnis bieten, unabhängig von der Hardware des Benutzers. Für Szenarien, bei denen eine gerätespezifische Behandlung gewünscht ist, definiert Zeigerereignisse eine pointerType Eigenschaft, um den Gerätetyp zu überprüfen, der das Ereignis erzeugt hat.

Die zum Handhaben der allgemeinen Zeigereingabe benötigten Ereignisse entsprechen den Mausereignissen (mousedown/pointerdown, mousemove/pointermove, usw.). Folglich sind Zeigerereignistypen absichtlich den Mausereignistypen ähnlich.

Ein Zeigerereignis enthält die üblichen Eigenschaften, die in Mausereignissen vorhanden sind (Clientkoordinaten, Zielelement, Tastenstatus usw.) sowie neue Eigenschaften für andere Eingabearten: Druck, Kontaktgeometrie, Neigung usw. Tatsächlich erbt das PointerEvent Interface alle Eigenschaften des MouseEvent, was so die Migration von Inhalten von Mausereignissen zu Zeigerereignissen erleichtert.

Terminologie

aktiver Tastenstatus

Der Zustand, wenn ein Zeiger einen Nicht-Null-Wert für die buttons Eigenschaft hat. Zum Beispiel im Fall eines Stiftes, wenn der Stift physischen Kontakt mit dem Digitalisierer hat oder mindestens eine Taste gedrückt ist, während der Stift schwebt.

aktiver Zeiger

Jedes Zeiger Eingabegerät, das Ereignisse auslösen kann. Ein Zeiger wird als aktiv betrachtet, wenn er weiterhin Ereignisse auslösen kann. Zum Beispiel wird ein Stift, der sich im Abwärtszustand befindet, als aktiv betrachtet, da er zusätzliche Ereignisse auslösen kann, wenn der Stift angehoben oder bewegt wird.

Digitalisierer

Ein Erfassungsgerät mit einer Oberfläche, die Kontakt erkennen kann. Am häufigsten handelt es sich um einen Touch-fähigen Bildschirm, der Eingaben von einem Eingabegerät wie einem Stift, Stylus oder Finger erfassen kann. Einige Erfassungsgeräte können die Nähe des Eingabegeräts erkennen, und der Zustand wird als Schweben in der Nähe der Maus ausgedrückt.

Treffertest

Der Prozess, den der Browser verwendet, um ein Zielelement für ein Zeigerereignis zu bestimmen. Typischerweise wird dies bestimmt, indem der Standort des Zeigers und das visuelle Layout von Elementen in einem Dokument auf Bildschirmmedien berücksichtigt werden.

Zeiger

Eine hardware-unabhängige Darstellung von Eingabegeräten, die auf eine spezifische Koordinate (oder einen Satz von Koordinaten) auf einem Bildschirm abzielen können. Beispiele für Zeiger Eingabegeräte sind Maus, Stift/Stylus und Touch-Kontakte.

Zeigererfassung

Die Zeigererfassung erlaubt es, die Ereignisse für einen Zeiger auf ein bestimmtes Element umzuverteilen, anstatt auf das normale Ergebnis des Treffertests des Zeigerstandorts. Sehen Sie sich Den Zeiger erfassen für ein Beispiel an.

Anmerkung: Zeigererfassung ist etwas anderes als Zeigersperre, die physisch verhindert, dass der Zeiger einen Bereich verlässt.

Zeigerereignis

Ein DOM Ereignis, das für einen Zeiger ausgelöst wird.

Interfaces

Das primäre Interface ist das PointerEvent Interface, welches einen Konstruktor plus mehrere Ereignistypen und zugehörige globale Ereignishandler hat.

Der Standard enthält außerdem einige Erweiterungen für die Element und Navigator Interfaces.

Die folgenden Unterabschnitte enthalten kurze Beschreibungen jedes Interfaces und jeder Eigenschaft.

PointerEvent Interface

Das PointerEvent Interface erweitert das MouseEvent Interface und hat die folgenden Eigenschaften.

altitudeAngle Schreibgeschützt

Stellt den Winkel zwischen der Achse des Wandlers (Ein Zeiger oder Stylus) und der X-Y-Ebene eines Gerätescreens dar.

azimuthAngle Schreibgeschützt

Stellt den Winkel zwischen der Y-Z-Ebene und der Ebene dar, die sowohl die Achse des Wandlers (Ein Zeiger oder Stylus) als auch die Y-Achse enthält.

PointerEvent.persistentDeviceId Schreibgeschützt Experimentell

Eine eindeutige Kennung für das Zeigegerät, das das PointerEvent erzeugt hat.

pointerId Schreibgeschützt

Eine eindeutige Kennung für den Zeiger, der das Ereignis verursacht.

width Schreibgeschützt

Die Breite (Ausdehnung auf der X-Achse), in CSS-Pixeln, der Kontaktgeometrie des Zeigers.

height Schreibgeschützt

Die Höhe (Ausdehnung auf der Y-Achse), in CSS-Pixeln, der Kontaktgeometrie des Zeigers.

pressure Schreibgeschützt

Der normalisierte Druck der Zeigereingabe im Bereich von 0 bis 1, wobei 0 und 1 den minimalen und maximalen Druck darstellen, den die Hardware erkennen kann.

tangentialPressure Schreibgeschützt

Der normalisierte tangentiale Druck der Zeigereingabe (auch als Barrel-Druck oder Zylinderstress bekannt) im Bereich von -1 bis 1, wobei 0 die neutrale Position der Steuerung darstellt.

tiltX Schreibgeschützt

Der plane Winkel (in Grad, im Bereich von -90 bis 90) zwischen der Y-Z-Ebene und der Ebene, die sowohl die Achse des Zeigers (z.B. Stift-Stylus) als auch die Y-Achse enthält.

tiltY Schreibgeschützt

Der plane Winkel (in Grad, im Bereich von -90 bis 90) zwischen der X-Z-Ebene und der Ebene, die sowohl die Achse des Zeigers (z.B. Stift-Stylus) als auch die X-Achse enthält.

twist Schreibgeschützt

Die im Uhrzeigersinn gerichtete Rotation des Zeigers (z.B. Stift-Stylus) um seine Hauptachse in Grad, mit einem Wert im Bereich von 0 bis 359.

pointerType Schreibgeschützt

Gibt den Gerätetyp an, der das Ereignis verursacht hat (Maus, Stift, Touch, etc.).

isPrimary Schreibgeschützt

Gibt an, ob der Zeiger den primären Zeiger dieses Zeigertyps darstellt.

Ereignistypen und Globale Ereignishandler

Zeigerereignisse haben zehn Ereignistypen, von denen sieben ähnliche Semantik wie ihre Mausereignisgegenstücke haben (down, up, move, over, out, enter und leave).

Unten ist eine kurze Beschreibung jedes Ereignistyps.

Ereignis Beschreibung
pointerover Wird ausgelöst, wenn ein Zeiger in die Treffertest Grenzen eines Elements bewegt wird.
pointerenter Wird ausgelöst, wenn ein Zeiger in die Treffertest Grenzen eines Elements oder eines seiner Nachkommen bewegt wird, auch als Ergebnis eines pointerdown Ereignisses von einem Gerät, das das Schweben nicht unterstützt (siehe pointerdown).
pointerdown Wird ausgelöst, wenn ein Zeiger aktiften Tastenstatus erreicht.
pointermove Wird ausgelöst, wenn sich die Koordinaten eines Zeigers ändern. Dieses Ereignis wird auch verwendet, wenn eine Änderung des Zeigerzustands nicht von anderen Ereignissen gemeldet werden kann.
pointerup Wird ausgelöst, wenn ein Zeiger nicht mehr im aktiven Tastenstatus ist.
pointercancel Ein Browser löst dieses Ereignis aus, wenn er folgert, dass der Zeiger keine Ereignisse mehr erzeugen kann (zum Beispiel, wenn das zugehörige Gerät deaktiviert ist, oder der Browser entschieden hat, die Interaktion als Schwenken/Zoomen zu interpretieren). Informationen dazu, wie dieses Verhalten gesteuert wird, finden sich im Abschnitt zur touch-action CSS-Eigenschaft unten.
pointerout Wird aus verschiedenen Gründen ausgelöst, darunter: der Zeiger wird aus den Treffertest Grenzen eines Elements bewegt; das pointerup Ereignis für ein Gerät, das das Schweben nicht unterstützt, wird ausgelöst (siehe pointerup); nach dem Auslösen des pointercancel Ereignisses (siehe pointercancel); wenn ein Stift-Stylus den vom Digitalisierer erkennbaren Schweberbereich verlässt.
pointerleave Wird ausgelöst, wenn ein Zeiger aus den Treffertest Grenzen eines Elements bewegt wird. Bei Pen-Geräten wird dieses Ereignis ausgelöst, wenn der Stylus den vom Digitalisierer erkennbaren Schweberbereich 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 Zeigererfassung erhält.
lostpointercapture Wird ausgelöst, nachdem die Zeigererfassung für einen Zeiger freigegeben wurde.

Elementerweiterungen

Es gibt drei Erweiterungen des Element Interfaces:

hasPointerCapture()

Zeigt an, ob das Element, auf dem die Methode aufgerufen wird, die Zeigererfassung für den durch die Angabe identifizierten Zeiger hat.

releasePointerCapture()

Gibt (stoppt) die Zeigererfassung frei, die zuvor für ein spezifisches Zeigerereignis festgelegt wurde.

setPointerCapture()

Bezeichnet ein bestimmtes Element als Erfassungsziel für zukünftige Zeigerereignisse.

Die Navigator.maxTouchPoints Eigenschaft wird verwendet, um die maximale Anzahl gleichzeitiger Berührungspunkte zu bestimmen, die zu einem beliebigen Zeitpunkt unterstützt wird.

Beispiele

Dieser Abschnitt enthält Beispiele für die grundlegende Verwendung der Zeigerereignis-Interfaces.

Registrieren von Ereignishandlern

Dieses Beispiel registriert einen Handler für jeden Ereignistyp für das angegebene Element.

html
<div id="target">Touch me…</div>
js
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 den Zugriff auf alle Eigenschaften eines Zeigerereignisses.

html
<div id="target">Touch me…</div>
js
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 (z.B. ein Gerät mit einem Touchscreen und einer Maus), oder ein Zeiger, der mehrere Kontaktpunkte unterstützt (z.B. ein Touchscreen, der mehrere Fingerberührungen unterstützt). Die Anwendung kann die isPrimary Eigenschaft verwenden, um einen Hauptzeiger unter 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, daher wird es immer der primäre Zeiger sein. Für Berührungseingaben wird ein Zeiger als primär angesehen, wenn der Benutzer den Bildschirm berührte, als es keine anderen aktiven Berührungen gab. Für Stift- und Stylus-Eingaben wird ein Zeiger als primär angesehen, wenn der Benutzerstift den Bildschirm berührt hat, als es keine anderen aktiven Stifte gab.

Bestimmen von Tastenstatus

Einige Zeigegeräte (wie Maus und Stift) unterstützen mehrere Tasten, und die Tastenpressen können akkordiert werden (d.h. durch Drücken einer zusätzlichen Taste, während eine andere Taste am Zeigegerät bereits gedrückt ist).

Um den Status der Tastenpressen zu bestimmen, verwenden Zeigerereignisse die button und buttons Eigenschaften der MouseEvent Interface (von denen PointerEvent erbt).

Die folgende Tabelle zeigt die Werte von button und buttons für die verschiedenen Gerätezustände.

Gerätezustand button buttons
Weder Tasten noch Touch/Stiftkontakt haben sich seit dem letzten Ereignis geändert -1
Mausbewegung ohne gedrückte Tasten, Stift wird im Schweben ohne gedrückte Tasten bewegt 0
Linke Maus, Touch-Kontakt, Kontakt mit Stift 0 1
Mittlere Maus 1 4
Rechte Maus, Stift mit Fass-Taste 2 2
X1 (zurück) Maus 3 8
X2 (vorwärts) Maus 4 16
Stift-Radiergummi-Taste 5 32

Hinweis: Die button Eigenschaft zeigt eine Änderung im Zustand der Taste an. Jedoch, wie im Fall der Berührung, wenn mehrere Ereignisse gleichzeitig auftreten, haben alle dasselbe Wert.

Den Zeiger erfassen

Die Zeigererfassung ermöglicht es, dass Ereignisse für ein bestimmtes Zeigerereignis auf ein bestimmtes Element umgeleitet werden, anstatt auf das normale Treffertest an der Position des Zeigers. Dies kann verwendet werden, um sicherzustellen, dass ein Element weiterhin Zeigerereignisse erhält, auch wenn der Kontakt des Zeigegeräts das Element verlässt (z.B. durch Scrollen oder Verschieben).

Die Zeigererfassung lässt das Ziel alle nachfolgenden Zeigerereignisse erfassen, als ob sie über dem erfassenden Ziel stattfinden würden. Dementsprechend werden pointerover, pointerenter, pointerleave und pointerout nicht ausgelöst, solange diese Erfassung aktiv ist. Für touch-fähige Browser, die direkte Manipulation erlauben, wird eine implizite Zeigererfassung auf dem Element ausgeführt, wenn ein pointerdown Ereignis auftritt. Die Erfassung kann manuell durch Aufrufen von element.releasePointerCapture auf dem Zielelement aufgehoben werden, oder wird nach einem pointerup oder pointercancel Ereignis automatisch aufgehoben.

Hinweis: Wenn Sie ein Element im DOM verschieben müssen, stellen Sie sicher, dass Sie setPointerCapture() nach den DOM-Bewegungen aufrufen, damit setPointerCapture() es nicht aus den Augen verliert. Zum Beispiel, wenn Sie Element.append() verwenden müssen, um ein Element an eine andere Stelle zu verschieben, stellen Sie sicher, dass Sie setPointerCapture() darauf erst nach dem Aufruf von Element.append() aufrufen.

Das folgende Beispiel zeigt, wie die Zeigererfassung auf einem Element festgelegt wird.

html
<div id="target">Touch me…</div>
js
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, wie eine Zeigererfassung freigegeben wird (wenn ein pointercancel Ereignis eintritt). Der Browser macht dies automatisch, wenn ein pointerup oder pointercancel Ereignis eintritt.

html
<div id="target">Touch me…</div>
js
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);

touch-action CSS-Eigenschaft

Die touch-action CSS-Eigenschaft wird verwendet, um festzulegen, ob der Browser sein Standardverhalten (native) für Touch-Anwendungen (wie Zoomen oder Scrollen) auf eine Region anwenden soll oder nicht. Diese Eigenschaft kann auf alle Elemente angewendet werden außer: nicht-ersetzenbare Inline-Elemente, Tabellzeilen, Zeilengruppen, Tabellenspalten und Spaltengruppen.

Ein Wert von auto bedeutet, dass der Browser sein Standard-Touch-Verhalten auf die spezifizierte Region anwenden kann und der Wert none deaktiviert das Standard-Touch-Verhalten des Browsers für die Region. Die Werte pan-x und pan-y bedeuten, dass Berührungen, die auf der spezifizierten Region beginnen, nur für horizontale beziehungsweise vertikale Bildläufe sind. Der Wert manipulation bedeutet, dass der Browser Berührungen, die auf dem Element beginnen, nur für Bildläufe und Zooms in Betracht ziehen kann.

Im folgenden Beispiel wird das Standard-Touch-Verhalten des Browsers für das div Element deaktiviert.

html
<html lang="en">
  <body>
    <div style="touch-action:none;">Can't touch this…</div>
  </body>
</html>

Im folgenden Beispiel wird das Standard-Touch-Verhalten für einige button Elemente deaktiviert.

css
button#tiny {
  touch-action: none;
}

Im folgenden Beispiel wird, wenn das target Element berührt wird, nur in horizontaler Richtung gescrollt.

css
#target {
  touch-action: pan-x;
}

Kompatibilität mit Mausereignissen

Obwohl die Zeigerereignis-Interfaces Anwendungen ermöglichen, verbesserte Benutzererfahrungen auf zeigerfähigen Geräten zu erzeugen, ist die Realität, dass der Großteil der heutigen Webinhalte so entworfen ist, dass er nur mit Mauseingaben funktioniert. Folglich muss der Browser auch dann Mausereignisse verarbeiten, wenn er Zeigerereignisse unterstützt, damit Inhalte, die von Maus-Only-Eingaben ausgehen, ohne direkte Änderungen funktionieren. Idealerweise benötigt eine zeigerfähige Anwendung keine explizite Handhabung von Mauseingaben. Da der Browser Mausereignisse verarbeiten muss, können jedoch einige Kompatibilitätsprobleme auftreten, die behandelt werden müssen. Dieser Abschnitt enthält Informationen über die Interaktion zwischen Zeiger- und Mausereignissen und die Konsequenzen für Anwendungsentwickler.

Der Browser kann generische Zeigereingaben in Mausereignisse umwandeln, um die Kompatibilität mit mausbasierenden Inhalten zu gewährleisten. Diese Umwandlung von Ereignissen wird als Kompatibilitäts-Mausereignisse bezeichnet. Autoren können die Erstellung bestimmter Kompatibilitäts-Mausereignisse verhindern, indem sie das pointerdown-Ereignis stornieren, aber beachten Sie:

  • Mausereignisse können nur verhindert werden, solange der Zeiger nach unten gerichtet ist.
  • Schwebende Zeiger (z.B. eine Maus ohne gedrückte Tasten) können ihre Mausereignisse nicht verhindern.
  • Die mouseover, mouseout, mouseenter und mouseleave Ereignisse werden niemals verhindert (auch wenn der Zeiger nach unten gerichtet ist).

Best Practices

Hier sind einige Best Practices zu beachten, wenn Sie Zeigerereignisse verwenden:

  • Minimieren Sie die Menge der Arbeit, die in Ereignishandlern durchgeführt wird.
  • Fügen Sie die Ereignishandler einem spezifischen Zielelement hinzu (anstatt dem gesamten Dokument oder Knoten höher im Dokumentbaum).
  • Das Zielelement (Knoten) sollte groß genug sein, um die größte Kontaktoberfläche (typischerweise eine Fingerberührung) unterzubringen. Wenn das Zielgebiet zu klein ist, könnte das Berühren dazu führen, dass andere Ereignisse für angrenzende Elemente ausgelöst werden.

Spezifikationen

Specification
Pointer Events

Browser-Kompatibilität

Einige zusätzliche Werte wurden für die CSS touch-action Eigenschaft als Teil der Pointer Events Spezifikation definiert, aber derzeit haben diese Werte eine begrenzte Implementierungsunterstützung.

Siehe auch

Demos und Beispiele

Community

Verwandte Themen und Ressourcen