Thursday, May 3, 2012

Detecting that the browser has no mouse and is touch-only


I'm developing a webapp (not a website with pages of interesting text) with a very different interface for touch (your finger hides the screen when you click) and mouse (relies heavily on hover preview). How can I detect that my user has no mouse to present him the right interface? I plan to leave a switch for people with both mouse and touch (like some notebooks).



The touch event capability in the browser doesn't actually mean the user is using a touch device (for example, Modernizr doesn't cut it). The code that correctly answers the question should return false if the device has a mouse, true otherwise. For devices with mouse and touch, it should return false (not touch only)



As a side note, my touch interface might also be suitable for keyboard-only devices, so it's more the lack of mouse I'm looking to detect.


Source: Tips4all

7 comments:

  1. How about listening for a mousemove event on the document. Then until you hear that event you assume that the device is touch or keyboard only.

    var mouseDetected = false;
    function onMouseMove(e) {
    unlisten('mousemove', onMouseMove, false);
    mouseDetected = true;
    // initializeMouseBehavior();
    }
    listen('mousemove', onMouseMove, false);


    (Where listen and unlisten delegate to addEventListener or attachEvent as appropriate.)

    Hopefully this wouldn't lead to too much visual jank, it would suck if you need massive re-layouts based on mode...

    ReplyDelete
  2. Tera-WURFL can tell you the capabilities of the device that is visiting your site by comparing the browser signature against its database. Give it a look, its free!

    ReplyDelete
  3. Why don't you just detect if it has the ability to sense touches and/or to react to mouse movements?

    // This will also return false on
    // touch-enabled browsers like Chrome
    function has_touch() {
    return !!('ontouchstart' in window);
    }

    function has_mouse() {
    return !!('onmousemove' in window);
    }

    ReplyDelete
  4. I'd strongly recommend against this approach. Consider touch-screen, desktop-sized devices, and you have a different set of problems to solve.

    Please make your app usable without a mouse (i.e. no hover preview).

    ReplyDelete
  5. Since you're planning to offer a way to switch between the interfaces anyway, would it be feasible to simply ask the user to click a link or a button to "enter" the correct version of the application? Then you could remember their preference for future visits. It's not high-tech, but it's 100% reliable :-)

    ReplyDelete
  6. the main problem I see here is that most touch devices fire a mouse event along with the coresponding touch one (touchstart -> mousedown, touchmove -> mousemove, etc).
    For the keyboard only ones, at last for the modern ones, they have a generic browser so you can't even detect the presence of the MouseEvent class.

    The less painfull solution here would be, in my opinion, to display a menu at launch (with 'alt' management for the keyboard only users) and maybe storing the choice with localStorage/cookies/serverside or else to keep the salme choice the next time the visitor come.

    ReplyDelete
  7. It is generally a better idea to detect if the mouseover function is supported rather than detecting the OS/browser type. You can do that simply by the following:

    if (element.mouseover)
    {
    //Supports the mouseover event
    }


    Be sure that you don't do the following

    if (element.mouseover())
    {
    //Supports the mouseover event
    }


    As the latter would actually call the method rather than check for it's existence.

    You can read up more here:
    http://www.quirksmode.org/js/support.html

    ReplyDelete