Signatur
Beschreibung
TouchList.length liefert die Anzahl der Touch-Objekte in einer TouchList. Solche Listen bekommst du über ein TouchEvent, und zwar in drei Varianten: event.touches (alle Finger, die gerade den Bildschirm berühren), event.targetTouches (alle Finger auf dem Zielelement) und event.changedTouches (die Berührungspunkte, die sich mit diesem Ereignis geändert haben).
Meistens brauchst du length, um Mehrfinger-Gesten zu erkennen, zum Beispiel ein Zwei-Finger-Zoom (Pinch) oder ein Drei-Finger-Wischen. Außerdem lässt sich damit prüfen, ob beim touchend noch Finger auf dem Bildschirm liegen. Zusammen mit TouchList.item(index) oder dem Indexzugriff list[i] kannst du über alle Berührungspunkte iterieren.
Der Wert ist eine nicht-negative Ganzzahl und schreibgeschützt. Eine Zuweisung wird im nicht-strikten Modus stillschweigend ignoriert und löst im strikten Modus einen TypeError aus. Eine TouchList ist kein echtes Array. Sie hat zwar length und Indexzugriff, aber keine Methoden wie map oder filter.
Rückgabewert
Touch-Objekte in der Liste als nicht-negative Ganzzahl. 0 bedeutet eine leere Liste, etwa event.touches beim touchend des letzten Fingers.Beispiele
Anzahl aktiver Finger anzeigen
const flaeche = document.querySelector('#touch-flaeche');
const zeigeFinger = (event) => {
// event.touches enthält alle Finger auf dem Bildschirm
console.log(`Aktive Berührungen: ${event.touches.length}`);
};
flaeche.addEventListener('touchstart', zeigeFinger);
flaeche.addEventListener('touchend', zeigeFinger);
Zwei-Finger-Pinch-Geste erkennen
const bild = document.querySelector('#zoom-bild');
let startAbstand = null;
const abstand = (a, b) => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);
bild.addEventListener('touchstart', (event) => {
if (event.touches.length === 2) {
startAbstand = abstand(event.touches[0], event.touches[1]);
}
}, { passive: true });
bild.addEventListener('touchmove', (event) => {
// Nur bei genau zwei Fingern skalieren
if (event.touches.length !== 2 || startAbstand === null) return;
event.preventDefault(); // natives Browser-Zoomen unterdrücken
const faktor = abstand(event.touches[0], event.touches[1]) / startAbstand;
bild.style.transform = `scale(${faktor.toFixed(2)})`;
}, { passive: false });
bild.addEventListener('touchend', (event) => {
if (event.touches.length < 2) startAbstand = null;
});
Über changedTouches iterieren
document.addEventListener('touchend', (event) => {
const { changedTouches } = event;
for (let i = 0; i < changedTouches.length; i++) {
const t = changedTouches.item(i);
console.log(`Finger ${t.identifier} losgelassen bei (${t.clientX}, ${t.clientY})`);
}
// Alternativ in ein echtes Array umwandeln
const ids = Array.from(changedTouches, (t) => t.identifier);
console.log('IDs:', ids, 'Anzahl:', ids.length);
});
// Wichtig · Fallstricke
- Die richtige Liste wählen: Beim
touchendundtouchcancelenthältevent.touchesden losgelassenen Finger nicht mehr. Deshalb isttouches.lengthbeim letzten Finger0. Den losgelassenen Finger findest du inchangedTouches. - Kein Array:
TouchListhat keine Array-Methoden. Wandle die Liste bei Bedarf mitArray.from(list)oder[...list]um. Die Liste ist iterierbar. - Schreibgeschützt: Eine Zuweisung an
lengthhat keine Wirkung und wirft im strikten Modus einenTypeError. - Kompatibilität: Touch-Events gibt es in allen mobilen Browsern und in Chromium-/Firefox-/Safari-Versionen auf Touch-Geräten. Auf Desktop-Geräten ohne Touchscreen ist
TouchEventoft nicht vorhanden oder wird nie ausgelöst. Für Maus, Stift und Touch zusammen sind Pointer Events meist die robustere Wahl. - Performance: Soll
preventDefault()intouchmovegreifen, muss der Listener mit{ passive: false }registriert werden. Andernfalls sind passive Listener für flüssiges Scrollen vorzuziehen. - Die maximale Zahl gleichzeitiger Berührungen hängt von der Hardware ab. Sie lässt sich über
navigator.maxTouchPointsabfragen.