Das größte Problem beim Versuch, Berührungen zu erkennen, sind Hybridgeräte, die sowohl Berührungen als auch das Trackpad / die Maus unterstützen. Selbst wenn Sie richtig erkennen können, ob das Gerät des Benutzers Touch unterstützt, müssen Sie wirklich erkennen, welches Eingabegerät der Benutzer gerade verwendet. Hier finden Sie eine detaillierte Beschreibung dieser Herausforderung und eine mögliche Lösung .
Grundsätzlich besteht der Ansatz, um herauszufinden, ob ein Benutzer gerade den Bildschirm berührt oder stattdessen eine Maus / ein Trackpad verwendet hat, darin, sowohl ein touchstart
als auch ein mouseover
Ereignis auf der Seite zu registrieren :
document.addEventListener('touchstart', functionref, false) // on user tap, "touchstart" fires first
document.addEventListener('mouseover', functionref, false) // followed by mouse event, ie: "mouseover"
Eine Berührungsaktion löst beide Ereignisse aus, wobei erstere ( touchstart
) auf den meisten Geräten immer an erster Stelle steht. Wenn Sie sich also auf diese vorhersehbare Abfolge von Ereignissen verlassen, können Sie einen Mechanismus erstellen can-touch
, der dem Dokumentstamm dynamisch eine Klasse hinzufügt oder daraus entfernt , um den aktuellen Eingabetyp des Benutzers zu diesem Zeitpunkt im Dokument wiederzugeben:
;(function(){
var isTouch = false //var to indicate current input type (is touch versus no touch)
var isTouchTimer
var curRootClass = '' //var indicating current document root class ("can-touch" or "")
function addtouchclass(e){
clearTimeout(isTouchTimer)
isTouch = true
if (curRootClass != 'can-touch'){ //add "can-touch' class if it's not already present
curRootClass = 'can-touch'
document.documentElement.classList.add(curRootClass)
}
isTouchTimer = setTimeout(function(){isTouch = false}, 500) //maintain "istouch" state for 500ms so removetouchclass doesn't get fired immediately following a touch event
}
function removetouchclass(e){
if (!isTouch && curRootClass == 'can-touch'){ //remove 'can-touch' class if not triggered by a touch event and class is present
isTouch = false
curRootClass = ''
document.documentElement.classList.remove('can-touch')
}
}
document.addEventListener('touchstart', addtouchclass, false) //this event only gets called when input type is touch
document.addEventListener('mouseover', removetouchclass, false) //this event gets called when input type is everything from touch to mouse/ trackpad
})();
Weitere Details hier .