Найбільша «готча» із спробою виявити дотик - це на гібридних пристроях, які підтримують як дотик, так і трекпад / мишу. Навіть якщо ви зможете правильно визначити, чи підтримує пристрій користувача дотик, вам потрібно дійсно виявити, яким пристроєм введення користувач користується в даний час . Тут детально написано цей виклик та можливе рішення .
По суті, підхід до з'ясування того, чи користувач просто торкнувся екрана чи використовував мишу / трекпад замість цього, це зареєструвати як touchstart
і mouseover
події на сторінці:
document.addEventListener('touchstart', functionref, false) // on user tap, "touchstart" fires first
document.addEventListener('mouseover', functionref, false) // followed by mouse event, ie: "mouseover"
Дотикова дія спричинить обидві ці події, хоча попереднє ( touchstart
) завжди перше на більшості пристроїв. Отже, розраховуючи на цю передбачувану послідовність подій, ви можете створити механізм, який динамічно додає або видаляє can-touch
клас до кореня документа, щоб відобразити поточний тип введення користувача на даний момент у документі:
;(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
})();
Детальніше тут .