O maior problema na tentativa de detectar o toque está nos dispositivos híbridos que suportam o toque e o trackpad / mouse. Mesmo se você conseguir detectar corretamente se o dispositivo do usuário oferece suporte ao toque, o que você realmente precisa fazer é detectar qual dispositivo de entrada o usuário está usando no momento . Há uma descrição detalhada desse desafio e uma possível solução aqui .
Basicamente, a abordagem para descobrir se um usuário acabou de tocar na tela ou se usou um mouse / trackpad é registrar os eventos a touchstart
e mouseover
na página:
document.addEventListener('touchstart', functionref, false) // on user tap, "touchstart" fires first
document.addEventListener('mouseover', functionref, false) // followed by mouse event, ie: "mouseover"
Uma ação de toque acionará esses dois eventos, embora o primeiro ( touchstart
) sempre seja o primeiro na maioria dos dispositivos. Portanto, contando com essa sequência previsível de eventos, é possível criar um mecanismo que inclua ou remova dinamicamente uma can-touch
classe na raiz do documento para refletir o tipo de entrada atual do usuário neste momento no documento:
;(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
})();
Mais detalhes aqui .