What's the best way to detect a 'touch screen' device using JavaScript?

后端 未结 30 2528
花落未央
花落未央 2020-11-21 23:50

I\'ve written a jQuery plug-in that\'s for use on both desktop and mobile devices. I wondered if there is a way with JavaScript to detect if the device has touch screen capa

30条回答
  •  臣服心动
    2020-11-22 00:10

    The biggest "gotcha" with trying to detect touch is on hybrid devices that support both touch and the trackpad/mouse. Even if you're able to correctly detect whether the user's device supports touch, what you really need to do is detect what input device the user is currently using. There's a detailed write up of this challenge and a possible solution here.

    Basically the approach to figuring out whether a user just touched the screen or used a mouse/ trackpad instead is to register both a touchstart and mouseover event on the page:

    document.addEventListener('touchstart', functionref, false) // on user tap, "touchstart" fires first
    document.addEventListener('mouseover', functionref, false) // followed by mouse event, ie: "mouseover"
    

    A touch action will trigger both of these events, though the former (touchstart) always first on most devices. So counting on this predictable sequence of events, you can create a mechanism that dynamically adds or removes a can-touch class to the document root to reflect the current input type of the user at this moment on the document:

    ;(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
    })();
    

    More details here.

提交回复
热议问题