Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Proper touch button behavior for MobileSafari

MobileSafari as a rule has incorrect HTML button behavior (incorrect meaning: "not like an iOS native button"). Correct button behavior is as follows:

  • User touches button: Button highlights
  • User drags finger out of button: Button dims
  • User drags finger back into button: Button highlights
  • User drags finger out of button and releases: Button does not click

MobileSafari buttons highlight when you touch them, stay highlighted no matter where you move, and click no matter where you release them (unless the view scrolls, in which case the touch is always canceled, even if you re-enter the button).

This problem applies to all clickable things such as links (when -webkit-touch-callout is set to none). I have only found one web application so far that has correct button behavior: Facebook. Looking at their code for it, it looks like they've done quite a lot of jumping-through-hoops to make it work correctly (tracking all the mouse events manually and not using buttons at all). The code is dense, uses Javelin, and I'm not yet clear on all the pieces required to make it work.

I know I'm somewhat kidding myself (since if it were easy, everyone would do it), but I'm going to ask anyway. Is there any generally-available piece of code that handles this feature? Is there a simpler solution than reverse engineering Javelin, even if it is only applicable to WebKit? (Javelin isn't very-well suited to my lightweight needs.) My ultimate goal is correct button behavior for a UIWebView embedded in a native app, so hybrid JavaScript/ObjC solutions are acceptable as well (though no hybrid approaches come to mind).

like image 221
Rob Napier Avatar asked Jan 17 '12 16:01

Rob Napier


1 Answers

Basically what you'd want to do is build out some sort of hybrid hover functionality for touch devices, which detects when your finger moves in/out of the button in question.

I built a basic JSFiddle which implements some barebones functionality. If you know any javascript, I think you'll get the idea.

Live JSFiddle DEMO

Try it on your iOS device (and maybe your Android device??).

- brian

like image 77
briangonzalez Avatar answered Oct 08 '22 18:10

briangonzalez