"gotcha" ที่ใหญ่ที่สุดที่พยายามตรวจจับการสัมผัสอยู่ในอุปกรณ์ไฮบริดที่รองรับทั้งการสัมผัสและแทร็คแพด / เมาส์ แม้ว่าคุณจะสามารถตรวจสอบได้อย่างถูกต้องว่าอุปกรณ์ของผู้ใช้รองรับการสัมผัสสิ่งที่คุณต้องทำคือการตรวจสอบสิ่งที่อุปกรณ์ป้อนข้อมูลที่ผู้ใช้กำลังใช้งานอยู่ มีการเขียนรายละเอียดของความท้าทายนี้และเป็นวิธีการแก้ปัญหาที่เป็นไปได้ที่นี่
โดยทั่วไปวิธีการหาว่าผู้ใช้เพิ่งแตะหน้าจอหรือใช้เมาส์ / แทร็กแพดแทนการลงทะเบียนทั้งสอง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
})();
รายละเอียดเพิ่มเติม ที่นี่