"Gotcha" lớn nhất với việc cố gắng phát hiện cảm ứng là trên các thiết bị lai hỗ trợ cả cảm ứng và bàn di chuột / chuột. Ngay cả khi bạn có thể phát hiện chính xác liệu thiết bị của người dùng có hỗ trợ cảm ứng hay không, điều bạn thực sự cần làm là phát hiện thiết bị đầu vào nào mà người dùng hiện đang sử dụng. Có một bài viết chi tiết về thách thức này và một giải pháp khả thi ở đây .
Về cơ bản, cách tiếp cận để tìm hiểu xem người dùng chỉ chạm vào màn hình hay sử dụng chuột / bàn di chuột thay vào đó là đăng ký cả a touchstart
và mouseover
sự kiện trên trang:
document.addEventListener('touchstart', functionref, false) // on user tap, "touchstart" fires first
document.addEventListener('mouseover', functionref, false) // followed by mouse event, ie: "mouseover"
Một hành động chạm sẽ kích hoạt cả hai sự kiện này, mặc dù trước đây ( touchstart
) luôn luôn đầu tiên trên hầu hết các thiết bị. Vì vậy, dựa vào chuỗi sự kiện có thể dự đoán được này, bạn có thể tạo một cơ chế tự động thêm hoặc xóa một can-touch
lớp vào gốc tài liệu để phản ánh loại đầu vào hiện tại của người dùng tại thời điểm này trên tài liệu:
;(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
})();
Thêm chi tiết tại đây .