I have some websites I built times ago, that use jquery mouse events...I just got an ipad and i noticed that all the mouse over events are translated in clicks...so for instance i have to do two clicks instead of one..(the first hover, than the actual click)
is there a workaround ready to solve this? maybe a jquery command i shoudl have used instead of mouseover/out etc.. thanks!
Seems there is a CSS solution after all. The reason Safari waits for a second touch is because of the background image (or elements) you usually assign on the :hover event. If there is none to be shown - you won't have any problems. The solution is to target iOS platform with secondary CSS file (or style in case of a JS approach) which overrides :hover background to inherit for example and keep hidden the elements you were going to display on mouse over:
Here is an example CSS and HTML - a product block with a starred label on mouse over:
HTML:
CSS:
Solution (secondary CSS):
Just an improvement to avoid redirection when you slide your finger on a link by mistake.
I think it'd be wise to try
mouseenter
in place ofmouseover
. It's what's used internally when binding to.hover(fn,fn)
and is generally what you want.It is not entirely clear what your question is, but if you just want to eliminate the double click, while retaining the hover effect for the mouse, my advice is to:
touchstart
andmouseenter
.mouseleave
,touchmove
andclick
.Background
In order to simulate a mouse, browsers such as Webkit mobile fire the following events if a user touches and releases a finger on touch screen (like iPad) (source: Touch And Mouse on html5rocks.com):
touchstart
touchmove
touchend
mouseover
mouseenter
mouseover
,mouseenter
ormousemove
event changes the page content, the following events are never fired.mousemove
mousedown
mouseup
click
It does not seem possible to simply tell the webbrowser to skip the mouse events.
What's worse, if a mouseover event changes the page content, the click event is never fired, as explained on Safari Web Content Guide - Handling Events, in particular figure 6.4 in One-Finger Events. What exactly a "content change" is, will depend on browser and version. I've found that for iOS 7.0, a change in background color is not (or no longer?) a content change.
Solution Explained
To recap:
touchstart
andmouseenter
.mouseleave
,touchmove
andclick
.Note that there is no action on
touchend
!This clearly works for mouse events:
mouseenter
andmouseleave
(slightly improved versions ofmouseover
andmouseout
) are fired, and add and remove the hover.If the user actually
click
s a link, the hover effect is also removed. This ensure that it is removed if the user presses the back button in the web browser.This also works for touch events: on
touchstart
the hover effect is added. It is '''not''' removed ontouchend
. It is added again onmouseenter
, and since this causes no content changes (it was already added), theclick
event is also fired, and the link is followed without the need for the user to click again!The 300ms delay that a browser has between a
touchstart
event andclick
is actually put in good use because the hover effect will be shown during this short time.If the user decides to cancel the click, a move of the finger will do so just as normal. Normally, this is a problem since no
mouseleave
event is fired, and the hover effect remains in place. Thankfully, this can easily be fixed by removing the hover effect ontouchmove
.That's it!
Note that it is possible to remove the 300ms delay, for example using the FastClick library, but this is out of scope for this question.
Alternative Solutions
I've found the following problems with the following alternatives:
touchend
: This will incorrectly follow the link, even if the user only wanted to scroll or zoom, without the intention of actually clicking the link.touchend
that is used as a if-condition in subsequent mouse events to prevents state changes at that point in time. The variable is reset in the click event. This is a decent solution if you really don't want a hover effect on touch interfaces. Unfortunately, this does not work if atouchend
is fired for another reason and no click event is fired (e.g. the user scrolled or zoomed), and is subsequently trying to following the link with a mouse (i.e on a device with both mouse and touch interface).Further Reading
mouseover
ormousemove
event.See also iPad/iPhone double click problem and Disable hover effects on mobile browsers.
I just found out that it works if you add an empty listener, don't ask me why, but I tested it on iPhone and iPad with iOS 9.3.2 and it worked fine.
This works for me when you have jquery ui dropdown