Start · Sprachen · JavaScript · Referenz · InputDeviceCapabilities

InputDeviceCapabilities

Schnittstelle

Beschreibt die Fähigkeiten des physischen Eingabegeräts, das ein Ereignis ausgelöst hat, z. B. ob es auch Touch-Ereignisse erzeugt (<code>firesTouchEvents</code>).

seit JavaScript Experimentell – nur Chromium-Browser (Chrome 47+, Kategorie: webapi

Signatur

interface InputDeviceCapabilities

Beschreibung

Die Schnittstelle InputDeviceCapabilities gehört zur Input Device Capabilities API. Sie liefert Informationen über das physische Gerät oder eine Gruppe verwandter Geräte, die ein Eingabeereignis erzeugt haben. Man greift auf eine Instanz meist über die Eigenschaft UIEvent.sourceCapabilities zu, die es bei Maus-, Tastatur-, Fokus- und Touch-Ereignissen gibt.

Der wichtigste Anwendungsfall ist das Erkennen sogenannter Kompatibilitäts-Mausereignisse. Nach einem Tipp auf den Touchscreen erzeugen Browser zusätzlich mousedown, mouseup und click, damit ältere Seiten weiter funktionieren. Wer touchstart und mousedown getrennt behandelt, führt dieselbe Aktion sonst zweimal aus. Ist event.sourceCapabilities.firesTouchEvents auf true gesetzt, stammt das Mausereignis von einem Touch-Gerät und lässt sich gezielt übergehen.

Die Schnittstelle hat folgende Eigenschaften (alle schreibgeschützt):

  • firesTouchEvents – boolean: Gibt an, ob das Gerät Touch-Ereignisse auslöst.
  • pointerMovementScrolls – boolean: Gibt an, ob das Gerät bei Zeigerbewegung scrollt statt einen Zeiger zu bewegen, z. B. bei einem Touchscreen. Diese Eigenschaft ist experimentell.

Mit dem Konstruktor new InputDeviceCapabilities(options) lassen sich eigene Instanzen erzeugen, etwa um synthetische Ereignisse mit passender sourceCapabilities auszulösen. Für neuen Code sind Pointer Events mit pointerType meist die bessere und browserübergreifende Wahl.

Parameter

Name Typ Default Beschreibung
$options Object {} Optionales Objekt (InputDeviceCapabilitiesInit) für den Konstruktor new InputDeviceCapabilities(options).
$options.firesTouchEvents boolean false Legt fest, ob das beschriebene Gerät Touch-Ereignisse erzeugt.
$options.pointerMovementScrolls boolean false Legt fest, ob Zeigerbewegungen bei diesem Gerät scrollen (experimentell).

Rückgabewert

Typ
InputDeviceCapabilities
Beschreibung
Eine Instanz, die die Fähigkeiten des Eingabegeräts beschreibt. Über UIEvent.sourceCapabilities kann der Wert auch null sein, etwa bei synthetischen Ereignissen oder wenn kein Gerät bekannt ist.

Beispiele

Doppelte Verarbeitung von Touch und Maus vermeiden

const button = document.querySelector('#menu-toggle');

const toggleMenu = () => {
  document.body.classList.toggle('menu-open');
  console.log('Menü umgeschaltet');
};

button.addEventListener('touchstart', (event) => {
  toggleMenu();
});

button.addEventListener('mousedown', (event) => {
  // Kompatibilitäts-Mausereignis nach einem Tipp übergehen
  if (event.sourceCapabilities?.firesTouchEvents) {
    return;
  }
  toggleMenu();
});
Menü umgeschaltet (nur einmal pro Tipp bzw. Klick)

Eigene Instanz mit dem Konstruktor erzeugen

if ('InputDeviceCapabilities' in window) {
  const touchDevice = new InputDeviceCapabilities({ firesTouchEvents: true });
  const mouseDevice = new InputDeviceCapabilities();

  console.log(touchDevice.firesTouchEvents);
  console.log(mouseDevice.firesTouchEvents);
} else {
  console.log('InputDeviceCapabilities wird nicht unterstützt');
}
true false

Synthetisches Ereignis mit Gerätefähigkeiten auslösen

const target = document.querySelector('#canvas');

target.addEventListener('click', (event) => {
  const caps = event.sourceCapabilities;
  console.log('Quelle ist Touch-Gerät:', caps ? caps.firesTouchEvents : 'unbekannt');
});

const simulated = new MouseEvent('click', {
  bubbles: true,
  sourceCapabilities: new InputDeviceCapabilities({ firesTouchEvents: true })
});

target.dispatchEvent(simulated);
Quelle ist Touch-Gerät: true

// Wichtig · Fallstricke

Browserunterstützung: Die API ist experimentell und steht nur in Chromium-basierten Browsern zur Verfügung. Firefox und Safari unterstützen sie nicht. Prüfe deshalb vorher mit 'InputDeviceCapabilities' in window, ob sie vorhanden ist, und greife über Optional Chaining zu (event.sourceCapabilities?.firesTouchEvents).

Der Wert kann null sein: Bei Ereignissen aus dispatchEvent() ohne die Option sourceCapabilities oder bei unbekannter Quelle ist sourceCapabilities gleich null. Ein direkter Zugriff auf firesTouchEvents wirft dann einen TypeError.

Alternative: Für browserübergreifenden Code solltest du pointerdown, pointerup usw. verwenden und event.pointerType auswerten ("mouse", "touch" oder "pen"). Damit entfallen getrennte Touch- und Maus-Handler weitgehend.

Die Eigenschaft beschreibt kein Gerät, sondern eine Fähigkeit: firesTouchEvents sagt nur, ob Touch-Ereignisse ausgelöst werden. Welches Gerät genau verwendet wurde, erfährst du daraus nicht. Für Rückschlüsse auf die Hardware (Fingerprinting) ist die Eigenschaft nicht geeignet.