Früher war es einfach, auf Dinge im Web zu verweisen. Du hattest eine Maus, du hast sie bewegt und manchmal Schaltflächen gedrückt haben und das war‘s. Alles, was kein Maus wurde als eine emuliert und die Entwickler wussten genau, worauf sie zählen sollten.
Einfach bedeutet aber nicht unbedingt, dass es gut ist. Mit der Zeit wurde es immer mehr Es ist wichtig, dass nicht alles eine Maus war oder vorgetäuscht ist: Sie hätten Druckempfindliche und neigbare Stifte sorgen für kreative Freiheit; könnten Sie Ihre Finger, Sie brauchten nur das Gerät und Ihre Hand. und warum nicht mehr als einen Finger benutzen?
Es gab Touch-Events verwendet, um uns dabei zu helfen, aber es sind ein völlig separates API, speziell für Berührungen, sodass Sie zwei separate Ereignismodelle programmieren müssen, wenn Sie die sowohl Maus als auch Touchfunktion unterstützen möchten. Chrome 55 wird mit einem neueren Standard ausgeliefert das beide Modelle vereint: Zeigerereignisse.
Ein Einzelereignismodell
Mit Zeiger-Ereignissen wird die Zeigereingabemodell für den Browser, das Touchscreen, Stifte und Mäuse zusammenbringt in einer Gruppe von Ereignissen zusammenfassen. Beispiel:
document.addEventListener('pointermove',
ev => console.log('The pointer moved.'));
foo.addEventListener('pointerover',
ev => console.log('The pointer is now over foo.'));
Hier ist eine Liste aller verfügbaren Ereignisse. sind Sie mit Mausereignissen vertraut:
pointerover
|
Der Zeiger hat den Begrenzungsrahmen des Elements erreicht.
Bei Geräten, die Mouseover unterstützen, geschieht dies sofort.
pointerdown -Ereignis für Geräte, die dies nicht tun.
|
pointerenter
|
Ähnlich wie „pointerover “, aber ohne Bubble und Ziehpunkte
und Nachfolgerelemente unterschiedlich.
Details zu den Spezifikationen
|
pointerdown
|
Der Zeiger befindet sich nun in einem aktiven Schaltflächenstatus, entweder oder der Kontakt hergestellt wird, je nach Semantik des Eingabegerät. |
pointermove
|
Die Position des Zeigers hat sich geändert. |
pointerup
|
Der Mauszeiger befindet sich nicht mehr im Status der Schaltfläche „Aktiv“. |
pointercancel
|
Ein Fehler ist aufgetreten und es ist unwahrscheinlich, dass der Zeiger weitere Ereignisse. Das heißt, Sie sollten alle laufenden Aktionen abbrechen und in einen neutralen Eingabezustand zurück. |
pointerout
|
Der Zeiger hat den Begrenzungsrahmen des Elements oder Bildschirms verlassen. Auch nach einer
pointerup , wenn das Gerät den Mauszeiger nicht unterstützt.
|
pointerleave
|
Ähnlich wie „pointerout “, aber ohne Bubble und Ziehpunkte
und Nachfolgerelemente unterschiedlich.
Details zu den Spezifikationen
|
gotpointercapture
|
Das Element hat eine Zeigeraufnahme empfangen. |
lostpointercapture
|
Zeiger, der erfasst wurde, wurde veröffentlicht. |
Verschiedene Eingabetypen
Mit Pointer-Ereignissen können Sie
Code eingabeunabhängig schreiben.
ohne separate Event-Handler für verschiedene Eingabegeräte registrieren zu müssen.
Natürlich müssen Sie die Unterschiede zwischen den Eingabetypen berücksichtigen, z. B.
gilt das Konzept des Hovers. Wenn Sie die verschiedenen Eingabegerätetypen unterscheiden möchten, z. B. um
separate Codes/Funktionen für verschiedene Eingaben. Sie können dies jedoch
innerhalb derselben Event-Handler unter Verwendung der pointerType
-Eigenschaft der
PointerEvent
. Wenn Sie beispielsweise eine Navigationsleiste programmieren,
haben für Ihr pointermove
-Ereignis die folgende Logik:
switch(ev.pointerType) {
case 'mouse':
// Do nothing.
break;
case 'touch':
// Allow drag gesture.
break;
case 'pen':
// Also allow drag gesture.
break;
default:
// Getting an empty string means the browser doesn't know
// what device type it is. Let's assume mouse and do nothing.
break;
}
Standardaktionen
In Browsern mit Touchscreen werden bestimmte Touch-Gesten verwendet, um die Seite zu scrollen, zu zoomen oder zu aktualisieren.
Im Fall von Berührungsereignissen erhalten Sie weiterhin Ereignisse,
finden – zum Beispiel wird touchmove
auch dann ausgelöst, wenn der Nutzer scrollt.
Wenn eine Standardaktion wie Scrollen oder Zoomen ausgelöst wird,
erhalten Sie ein pointercancel
-Ereignis, das darauf hinweist, dass der Browser
den Zeiger bewegen. Beispiel:
document.addEventListener('pointercancel',
ev => console.log('Go home, the browser is in charge now.'));
Integrierte Geschwindigkeit: Dieses Modell ermöglicht standardmäßig eine bessere Leistung. im Vergleich zu Touch-Ereignissen, bei denen Sie passive Ereignis-Listener um das gleiche Maß an Reaktionsfähigkeit zu erreichen.
Mit der Funktion
touch-action
CSS-Property. Wenn Sie die Richtlinie für ein Element auf none
festlegen, werden alle
Browser-definierte Aktionen, die über dieses Element gestartet wurden. Es gibt jedoch eine Reihe von
weitere Werte für eine genauere Steuerung, wie z. B. pan-x
,
dass der Browser auf Bewegungen auf der x-Achse, aber nicht auf der y-Achse reagiert. Chrome 55
unterstützt die folgenden Werte:
auto
|
Standard; kann der Browser jede Standardaktion ausführen. |
none
|
Der Browser darf keine Standardaktionen ausführen. |
pan-x
|
Der Browser darf nur die Standardaktion für horizontales Scrollen ausführen. |
pan-y
|
Der Browser darf nur die Standardaktion für vertikales Scrollen ausführen. |
pan-left
|
Der Browser darf nur die Standardaktion für horizontales Scrollen ausführen. und die Seite nur nach links schwenken. |
pan-right
|
Der Browser darf nur die Standardaktion für horizontales Scrollen ausführen. und die Seite nur nach rechts schwenken. |
pan-up
|
Der Browser darf nur die Standardaktion „Vertikales Scrollen“ ausführen. und die Seite nur nach oben schwenken. |
pan-down
|
Der Browser darf nur die Standardaktion „Vertikales Scrollen“ ausführen. und die Seite nur nach unten schwenken. |
manipulation
|
Der Browser darf nur Scroll- und Zoomaktionen ausführen. |
Zeigeraufnahme
Ich habe eine frustrierende Stunde damit verbracht, ein defektes mouseup
zu debuggen
bis Sie gemerkt haben, dass dies daran liegt,
dass die Nutzenden die Schaltfläche loslassen,
außerhalb Ihres Klickziels liegen? Nein? Okay, dann bin es vielleicht nur ich.
Bis jetzt gab es jedoch keine wirklich gute Methode, dieses Problem anzugehen. Gern.
könnten Sie den mouseup
-Handler für das Dokument einrichten und
um den Überblick zu behalten. Das ist nicht die sauberste Lösung,
insbesondere, wenn Sie eine Webkomponente erstellen und versuchen,
isoliert.
Zeigerereignisse bieten eine viel bessere Lösung: Sie können den Zeiger erfassen,
damit Sie dieses pointerup
-Ereignis (oder ein anderes, schwer aufrufbares Ereignis) erhalten.
Freunde).
const foo = document.querySelector('#foo');
foo.addEventListener('pointerdown', ev => {
console.log('Button down, capturing!');
// Every pointer has an ID, which you can read from the event.
foo.setPointerCapture(ev.pointerId);
});
foo.addEventListener('pointerup',
ev => console.log('Button up. Every time!'));
Unterstützte Browser
Zum Zeitpunkt der Entstehung dieses Artikels werden Zeigerereignisse in Internet Explorer 11 unterstützt, Microsoft Edge, Chrome und Opera sowie teilweise Unterstützung in Firefox. Sie können finden Sie auf caniuse.com eine aktuelle Liste.
Sie können das Polyfill mit Zeigerereignissen für die Lücken füllen. Die Browserunterstützung während der Laufzeit unkompliziert:
if (window.PointerEvent) {
// Yay, we can use pointer events!
} else {
// Back to mouse and touch events, I guess.
}
Zeigerereignisse eignen sich hervorragend für Progressive Enhancement:
Ändern Sie Ihre Initialisierungsmethoden, um die oben beschriebene Prüfung durchzuführen. Zeigerereignis hinzufügen
im if
-Block und bewegen Sie Ihre Maus-/Touch-Event-Handler zum
Block else
Also leg los und lass uns wissen, wie du sie findest!