Some of the more interesting data points from running my various touch/pointer tests on a variety of devices/browsers. All tests carried out manually, trying to get the cleanest possible results (e.g. getting a "clean" tap without any finger movement).
Some of these results first appeared in my presentation Getting touchy - an introduction to touch and pointer events, but have since been retested and are now collated here for easier referencing.
See also Peter-Paul Koch's Touch table, where he tests some further aspects beyond the scope of my tests.
Last updated 26 June 2014. See complete change history.
| Browser | 1st tap | 2nd tap | Tap out |
|---|---|---|---|
| Firefox OS 1.1 | touchstart > (touchmove)+ > touchend > mouseover > mouseenter > mousemove > mousedown > focus > mouseup > click |
touchstart > (touchmove)+ > touchend > mousemove > mousedown > mouseup > click |
mouseout > mouseleave > blur |
| iOS7.1 / Safari/WebView | touchstart > (touchmove)+ > touchend > (mouseenter) > mouseover > mousemove > mousedown > mouseup > click |
touchstart > (touchmove)+ > touchend > mousemove > mousedown > mouseup > click |
mouseleave > mouseout (when tapping to another focusable/activatable element, otherwise none) |
| Android 2.1 (HTC Hero) / "Internet" (WebKit 530.17) | touchstart > (touchmove)+ > touchend > mouseover > mousemove > mousedown > mouseup > click |
touchstart > (touchmove)+ > touchend > mousemove > mousedown > mouseup > click |
mouseout |
| Android 2.3.7 / "Browser" (WebKit 533.1) | touchstart > (touchmove)+ > touchend > mouseover > mousemove > mousedown > mouseup > click |
touchstart > (touchmove)+ > touchend > mousemove > mousedown > mouseup > click |
mouseout |
| Android 4.3 / Chrome M34 | touchstart > (touchmove)+ > touchend > mouseover > mousemove > mousedown > focus > mouseup > click |
touchstart > (touchmove)+ > touchend > mousemove > mousedown > mouseup > click |
mouseout > blur |
| Android 4.3 / Miren Browser, Maxthon Browser, Dolphin Browser (HD), "Browser" (WebKit 534.30) | mouseover > mousemove > touchstart > (touchmove)+ > touchend > mousedown > mouseup > click |
mousemove > touchstart > (touchmove)+ > touchend > mousedown > mouseup > click |
mouseout |
| Android 4.3 / UCBrowser 9.6 (WebKit 533.1) | mouseover > mousemove > touchstart > (touchmove)+ > touchend > mousedown > focus > mouseup > click |
mousemove > touchstart > (touchmove)+ > touchend > mousedown > mouseup > click |
mouseout > blur |
| Android 4.3 / Opera 19 (Blink) | touchstart > (touchmove)+ > touchend > mouseover > mousemove > mousedown > focus > mouseup > click |
touchstart > (touchmove)+ > touchend > mousemove > mousedown > mouseup > click |
mouseout > blur |
| Android 4.3 / Opera Classic | touchstart > (touchmove)+ > touchend > mouseenter > mouseover > mousemove > mousedown > focus > mouseup > click |
touchstart > (touchmove)+ > touchend > mousemove > mousedown > mouseup > click |
mouseout > mouseleave > blur |
| Android 4.3 / Firefox 28 | touchstart > (touchmove)+ > touchend > mouseover > mouseenter > mousemove > mousedown > focus > mouseup > click |
touchstart > (touchmove)+ > touchend > mousemove > mousedown > mouseup > click |
mouseout > mouseleave > blur |
| Android 4.3 / Puffin (no touch event support) | mouseover > mousemove > mousedown > mouseup > click |
mousemove > mousedown > mouseup > click |
mouseout |
| Android 4.4 / Maxthon Browser HD | touchstart > (touchmove)+ > touchend > mouseover > mousemove > mousedown > focus > mouseup > click |
touchend > (touchmove)+ > mousemove > mousedown > mouseup > click |
mouseout > blur |
| BlackBerry PlayBook 2.0 (2.1.0.1917) / "Browser" (WebKit 536.2) | touchstart > mouseover > mousemove > mousedown > touchend > mouseup > click |
touchstart > mousemove > mousedown > touchend > mouseup > click |
mouseout |
| Blackberry Z10 (BBOS 10.1) / "Browser" | touchstart > touchend > mouseover > mousemove > mousedown > mouseup > click |
touchstart > touchend > mousemove > mousedown > mouseup > click |
mouseout |
| Windows Phone 8 / IE10 (pointer events, vendor-prefixed) | mousemove > MSPointerOver > mouseover > mouseenter > MSPointerDown > mousedown > (MSGotPointerCapture) > focus (if previously focus was somewhere else on page) > MSPointerUp > mouseup > (MSLostPointerCapture) > MSPointerOut > mouseout > mouseleave > focus (if nothing previously focused on page) > click if moving finger slightly during press: mousemove > MSPointerOver > mouseover > mouseenter > MSPointerDown > mousedown > (MSGotPointerCapture) > focus > (MSPointerMove > mousemove)+ > MSPointerUp > mouseup > click > (MSLostPointerCapture) > MSPointerOut > mouseout > mouseleave |
mousemove > MSPointerOver > mouseover > mouseenter > MSPointerDown > mousedown > (MSGotPointerCapture) > MSPointerUp > mouseup > (MSLostPointerCapture) > MSPointerOut > mouseout > mouseleave > click if moving finger slightly during press: mousemove > MSPointerOver > mouseover > mouseenter > MSPointerDown > mousedown > (MSGotPointerCapture) > (MSPointerMove > mousemove)+ > MSPointerUp > mouseup > click > (MSLostPointerCapture) > MSPointerOut > mouseout > mouseleave |
blur |
| Windows Phone 8.1 / IE11 (pointer events) | mousemove > pointerover > mouseover > pointerenter > mouseenter > pointerdown > mousedown > (gotpointercapture) > (pointermove > mousemove)+ > pointerup > mouseup > (lostpointercapture) > pointerout > mouseout > pointerleave > mouseleave > focus > click if moving finger slightly during press: mousemove > pointerover > mouseover > pointerenter > mouseenter > pointerdown > mousedown > (gotpointercapture) > pointermove > mousemove > focus > (pointermove > mousemove)+ > pointerup > mouseup > (lostpointercapture) > pointerout > mouseout > pointerleave > mouseleave > click |
mousemove > pointerover > mouseover > pointerenter > mouseenter > pointerdown > mousedown > (gotpointercapture) > (pointermove > mousemove)+ > pointerup > mouseup > (lostpointercapture) > pointerout > mouseout > pointerleave > mouseleave > click unable to replicate a tap with slight movement which does not result in a pointercancel |
blur |
| Opera Mini 8 / iOS7.1.1 (Mini mode, Turbo and Wi-Fi consistent with Safari/iOS) | mouseover > mousemove > mousedown > mouseup > click |
mousemove > mousedown > mouseup > click |
mouseout > mouseleave > blur(when tapping to another focusable/activatable element, otherwise none) |
Generally, only a single ("sacrificial") mousemove is fired as part of the mouse compatibility events, just to rattle any legacy scripts that may be listening for this event.
There is a bug in WebKit (affecting iOS7.1/Safari and WebView) where mouseenter mouse compatibility event is not being fired correctly - see Bug 128534 - mouseenter mouse compat event not fired when listeners for touch events.
In the touch event model, mouse compatibility events (and final click) are only fired when a single finger is on the touchscreen. As soon as there's two or more (even outside of the element we're listening on), only touch events are fired and mouse compatibility events are suppressed.
There is a bug in current Blink implementations (noticed in Android/Chrome M34, M35 beta, and related Blink-based browsers like Opera) which also suppresses actual touch events if the first touch happened on a region with no touch handlers - see Issue 363321: No touch are ever events fired if the first finger went down in an area with no handler.
If during the tap there is too much movement of the finger (based on browser-specific threshold), this is considered a gesture rather than a tap, and any mouse compatibility events (including click) are generally not fired.
There is a bug in older versions of Blink (noticed in Android/Chrome M34, Android/Opera, Android/Maxthon) where even the slightest movement during a tap results in touchstart, a single touchmove only, and a touchcancel, with no further events being dispatched. This behavior is inconsistent with other implementations (as noted above, the result is usually touchstart, a few touchmove events, a touchend and then - provided the movement was within the threshold - the mouse compatibility and click events). Android/Chrome M35 (beta) seems to have fixed this bug - see Issue 363319: Swiping over a button with touch event handlers results in a single touchmove then touchcancel.
When testing touch events on desktop using developer tools emulation, note there are currently bugs in the order/type of events being fired:
Using touch gestures (e.g. swipe left/right, double-tap to activate) and "touch explore".
| Browser | Move to button | 1st activation | 2nd activation | Leave button |
|---|---|---|---|---|
| iOS7.1 / Safari/WebView + VoiceOver (with and without keyboard, and using "touch explore") | focus |
touchstart > touchend > mouseenter > mouseover > mousemove > mousedown > blur > mouseup > click |
touchstart > touchend > mousemove > mousedown > mouseup > click |
blur (when moving to another focusable element, otherwise none)mouseleave > mouseout (fired after element was already left, if original element was activated, and now another element was activated) |
| Android 4.3 / Chrome M34 + TalkBack (effectively ChromeVox, same behavior in other WebView/WebKit enabled browsers like Miren, Maxthon, etc) | focusmouseenter > mouseover > (mousemove)+ > focus(when using "touch explore") |
blur > mousedown > mouseup > click > focus |
blur > mousedown > mouseup > click > focus |
blur( mousemove)+ > mouseleave > mouseout(when using "touch expore") |
| Android 4.3 / Firefox 28 + TalkBack | nonemousover(when using "touch explore") |
touchstart > mousedown > focus > touchend > mouseup > click |
touchstart > mousedown > touchend > mouseup > click |
blur (only if element was activated at least once, and only when moving to another focusable element and activating it, otherwise none)mouseout > blur(when using "touch explore" - blur also only fired if element was activated at least once, and only when moving to another focusable element and activating it) |
| Windows Phone 8.1 / IE11 + Narrator | none |
focus > click |
click |
blur(after moving and activating another focusable element) |
No assistive technology available (yet) for Firefox OS, Windows Phone 8 or BlackBerry PlayBook.
Moving the focus (swiping left/right and using “touch explore”) will fire a JavaScript focus event – except in Android / Firefox with TalkBack, where focus is only sent as part of the series of events that follow an activation (double-tap). Though perhaps not a problem in practice, it does represent an incompatibility with other implementations - see Bug 1000082 - [AccessFu] When virtual focus is on a button or link, fire actual focus on the element, too, with thanks to Marco Zehe.
Mobile/tablet screenreaders are quite liberal in firing additional blur events when an element is activated – presumably in an attempt to prevent focus-specific CSS styles to "stick" after a user tapped on an in-page link or control. Careful if your code assumes blur means the user has moved away from the focusable element, as the AT focus is actually still there.
There are dramatic differences in the events being fired between gesture navigation and "touch explore" on Android.
There is a bug in WebKit (affecting iOS7.1/Safari and WebView) where mouseenter mouse compatibility event is not being fired correctly - see Bug 128534 - mouseenter mouse compat event not fired when listeners for touch events.
| Browser | Move to button | 1st activation | 2nd activation | Leave button |
|---|---|---|---|---|
| Android 2.1 (HTC Hero) + built-in trackball / "Internet" (WebKit 530.17) | mouseover > mousemove |
mousemove > mousedown > mouseup > click |
mousemove > mousedown > mouseup > click |
mouseout (when moving to another focusable element, otherwise none) |
| Android 2.3.7 / "Browser" + mouse | none |
touchstart > touchend > mouseover > mousemove > mousedown > mouseup > click |
touchstart > touchend > mousemove > mousedown > mouseup > click |
mouseout(when clicking somewhere else) |
| Android 2.3.7 / Firefox 28 + mouse | none |
touchstart > touchend > mouseover > mouseenter > mousemove > mousedown > focus > mouseup > click |
touchstart > touchend > mousemove > mousedown > mouseup > click |
mouseout > mouseleave > blur(when clicking somewhere else) |
| Android 2.3.7 / Opera 12 + mouse | none |
touchstart > touchend > mouseover > mousemove > mousedown > focus > mouseup > click |
touchstart > touchend mousedown > mouseup > click |
mouseout > mouseleave > blur(when clicking somewhere else) |
| Android 4.3 / "Browser" + mouse | mouseover > (mousemove)+ |
(mousemove)+ > touchstart > touchend > (mousemove)+ > mousedown > mouseup > click |
(mousemove)+ > touchstart > touchend > (mousemove)+ > mousedown > mouseup > click |
(mousemove)+ > mouseout |
| Android 4.3 / Chrome M34 + mouse | mouseenter > mouseover > (mousemove)+ |
mouseleave > mouseout > touchstart > touchend > mouseenter > mouseover > (mousemove)+ > mousedown > focus > mouseup > click > mousemove |
mouseleave > mouseout > touchstart > touchend > mouseenter > mouseover > (mousemove)+ > mousedown > mouseup > click > mousemove |
(mousemove)+ > mouseleave > mouseout |
| Android 4.3 / Chrome M34 + keyboard | focus |
click |
click |
blur |
| Android 4.3 / Opera 19 (Blink) + keyboard (no focus indication) | focus |
click |
click |
blur |
| Android 4.3 / Firefox 28 + mouse | mouseover > mouseenter > (mousemove)+ |
mouseleave > touchstart > touchend > mouseenter > (mousemove)+ > mousedown > focus > mouseup > click |
mouseleave > touchstart > touchend > mouseenter > (mousemove)+ > mousedown > mouseup > click > mousemove |
(mousemove)+ > mouseout > mouseleave |
| Android 4.3 / Firefox 28 + keyboard | focus |
click |
click |
blur |
| BlackBerry PlayBook 2.0 (2.1.0.1917) / "Browser" (WebKit 536.2) + mouse | mouseover > (mousemove)+ |
mousedown > mouseup > click |
mousedown > mouseup > click |
(mousemove)+ > mouseout |
| BlackBerry PlayBook 2.0 (2.1.0.1917) / "Browser" (WebKit 536.2) + keyboard | focus |
click |
click |
blur |
iOS does not support paired mouse, paired keyboard only works in same situations as on-screen keyboard (e.g. when prompted to enter a web address, enter data in a text input) unless VoiceOver is also activated (in which case it supports full control, but acts the same as regular VoiceOver with touch gestures).
Firefox OS (ZTE Open) currently does not support paired bluetooth mouse/keyboard. Windows Phone 8 (Nokia Lumia 520) does not support paired bluetooth mouse/keyboard.
Android 2.3.7 only has partial keyboard support. It was not possible to successfully pair a keyboard or mouse with the Android 2.1 HTC Hero test device.
| Browser | 1st tap | 2nd tap | Tap out |
|---|---|---|---|
| Windows 8 / Chrome 33 (supports touch events) | touchstart > (touchmove)+ > touchend > mouseover > mousemove > mousedown > focus > mouseup > click |
touchstart > (touchmove)+ > touchend > mousemove > mousedown > mouseup > click |
mouseout > blur |
| Windows 8 / Firefox 28 | mouseover > mouseenter > mousemove > mousedown > focus > (mousemove)+ > mouseup > click |
mousemove > mousedown > (mousemove)+ > mouseup > click |
mouseout > mouseleave > blur |
| Windows 8 / Opera 12 (Presto) | mouseover > mousemove > mousedown > focus > mouseup > click |
mousemove > mousedown > mouseup > click |
mouseout > mouseleave > blur |
| Windows 8 / Opera 20 (Blink) (supports touch events) | touchstart > (touchmove)+ > touchend > mouseover > mousemove > mousedown > focus > mouseup > click |
touchstart > (touchmove)+ > touchend > mousemove > mousedown > mouseup > click |
mouseout > blur |
| Windows 8 / IE11 (supports pointer events) | mousemove > pointerover > mouseover > pointerenter > mouseenter > pointerdown > mousedown > (gotpointercapture) > focus > pointermove > mousemove > pointerup > mouseup > (lostpointercapture) > pointerout > mouseout > pointerleave > mouseleave > click |
mousemove > pointerover > mouseover > pointerenter > mouseenter > pointerdown > mousedown > (gotpointercapture) > pointermove > mousemove > pointerup > mouseup > (lostpointercapture) > pointerout > mouseout > pointerleave > mouseleave > click |
blur |
If during the tap there is too much movement of the finger (based on browser-specific threshold), this is considered a gesture rather than a tap, and any mouse compatibility events (including click) are generally not fired.
Using traditional TAB / SHIFT+TAB / ENTER keyboard navigation. Notice the faked mouse events (particularly in OS X, when activating the test button with CTRL+⌥ ALT+SPACE as prompted by VoiceOver), which are not fired when assistive technology is not present, and are most likely meant for compatibility with sites that assume mouse interactions.
Included primarily as a point of comparison for the more specific case of desktop with touchscreen and assistive technology.
This table also includes classic Opera 12 (Presto) which has a unique spatial navigation feature (also used in Opera-based TV browsers): using SHIFT+cursor keys, this mode allows to set focus with the keyboard not in a sequential tab order, but based on the relative position of elements in the rendered layout (e.g. using SHIFT+→ to move to the closest focusable element to the right of the current element). Again, for compatibility with mouse-centric sites/scripts, Opera's spatial navigation fires the whole range of mouse events when entering and leaving an element.
| Browser | Move to button | 1st activation | 2nd activation | Leave button |
|---|---|---|---|---|
| Windows 8 / Chrome 34 + ChromeVox 1.31.4 | focus |
click (using ENTER or SPACE) mousedown > mouseup > click (using ChromeVox+SPACE) |
click (using ENTER or SPACE) mousedown > mouseup > click (using ChromeVox+SPACE) |
blur |
| Windows 8 / Chrome 33 + JAWS 15 | focus |
mousedown > mouseup > click |
mousedown > mouseup > click |
blur |
| Windows 8 / Chrome 34 + NVDA 2014.1 | focus |
mousedown > mouseup > click |
mousedown > mouseup > click |
blur |
| Windows 8 / Chrome 33 + Narrator | focus |
click |
click |
blur |
| Windows 8 / IE11 + JAWS 15 | focus |
click |
click |
blur |
| Windows 8 / IE11 + NVDA 2014.1 | focus |
click |
click |
blur |
| Windows 8 / IE11 + Narrator | focus |
click |
click |
blur |
| Windows 8 / IE11 + ZoomText 10.1 | focus |
click |
click |
blur |
| Windows 8 / Firefox 28 + JAWS 15 | focus |
mousedown > mouseup > click |
mousedown > mouseup > click |
blur |
| Windows 8 / Firefox 28 + NVDA 2014.1 | focus |
mousedown > mouseup > click |
mousedown > mouseup > click |
blur |
| Windows 8 / Firefox 28 + Narrator | focus |
click |
click |
blur |
| Windows 8 / Firefox 28 + ZoomText 10.1 | focus |
click |
click |
blur |
| Windows 8 / Opera 20 (Blink) + JAWS 15 | focus |
click |
click |
blur |
| Windows 8 / Opera 20 (Blink) + NVDA 2014.1 | focus |
mousedown > mouseup > click |
mousedown > mouseup > click |
blur |
| Windows 8 / Opera 20 (Blink) + Narrator | focus |
click |
click |
blur |
| Windows 8 / Opera 20 (Blink) + ZoomText 10.1 | focus |
click |
click |
blur |
| Windows 8 / Opera 12 (Presto) + Spatial Navigation (SHIFT+cursor keys) |
focus > mouseenter > mouseover > mousemove |
click |
click |
blur > mouseout > mouseleave |
| OS X 10.9.2 / Safari 7.0.2 + VoiceOver | focus |
click (using ENTER or SPACE) mousedown > mouseup > click (using CTRL+⌥ ALT+SPACE) |
click (using ENTER or SPACE) mousedown > mouseup > click (using CTRL+⌥ ALT+SPACE) |
blur |
| OS X 10.9.2 / Chrome 33 + VoiceOver | focus |
click (using ENTER or SPACE) mousedown > mouseup > click (using CTRL+⌥ ALT+SPACE) |
click (using ENTER or SPACE) mousedown > mouseup > click (using CTRL+⌥ ALT+SPACE) |
blur |
| OS X 10.9.2 / Firefox 29 + VoiceOver | focus |
click (using ENTER or SPACE) mousedown > blur > mouseup > click (using CTRL+⌥ ALT+SPACE) |
click (using ENTER or SPACE) mousedown >mouseup > click (using CTRL+⌥ ALT+SPACE) |
blur (if not activated or activated using ENTER or SPACE) none (if activated using CTRL+⌥ ALT+SPACE) |
When using VoiceOver on OS X, different events are fired depending on how elements are activated – for instance, activating a button with SPACE or ENTER will simply fire click, whereas CTRL+ALT+SPACE (the key combination prompted by VoiceOver) also fires the aforementioned "faked" mouse events.
Opera 12 (Presto) on Windows, OS X and Opera 20 (Blink) on OS X seem to have no (workable) support for assistive technology. ZoomText 10.1 currently not working at all with Chrome (34).
Using touch gestures (e.g. swipe left/right, double-tap to activate) and "touch explore", instead of traditional TAB / SHIFT+TAB / ENTER keyboard navigation.
| Browser | Move to button | 1st activation | 2nd activation | Leave button |
|---|---|---|---|---|
| Windows 8 / Chrome 33 + JAWS 15 gesture navigation and touch explore (no visible outline / focus indication) | none |
focus > mousedown > mouseup > click |
blur > focus > mousedown > mouseup > click |
blur (only once moved to another focusable element and activated that element) |
| Windows 8 / Chrome 33 + NVDA 2014.1 gesture navigation and touch explore (no visible outline / focus indication) | none |
focus > mousedown > mouseup > click |
mousedown > mouseup > click |
blur (only once moved to another focusable element and activated that element) |
| Windows 8 / Chrome 33 + Narrator gesture navigation and touch explore | none |
focus > mousedown > mouseup > click |
blur > focus > mousedown > mouseup > click |
blur (only once moved to another focusable element and activated that element) |
| Windows 8 / IE11 + JAWS 15 gesture navigation and touch explore (no visible outline / focus indication) | none |
focus > click |
click |
blur (only once moved to another focusable element and activated that element) |
| Windows 8 / IE11 + NVDA 2014.1 gesture navigation and touch explore (no visible outline / focus indication) | none |
focus > click |
click |
none (not even when moving to/activating another element) |
| Windows 8 / IE11 + Narrator gesture navigation and touch explore | none |
focus > click |
click |
blur (only once moved to another focusable element and activated that element) |
| Windows 8 / Firefox 28 + JAWS 15 gesture navigation and touch explore (no visible outline / focus indication) | none |
focus > mousedown > mouseup > click |
mousedown > mouseup > click |
blur (only once moved to another focusable element and activated that element) |
| Windows 8 / Firefox 28 + NVDA 2014.1 gesture navigation and touch explore (no visible outline / focus indication) | none |
mousedown > focus > mouseup > click |
mousedown > mouseup > click |
blur |
| Windows 8 / Firefox 28 + Narrator gesture navigation and touch explore | none |
focus > mousedown > mouseup > click |
mousedown > mouseup > click |
blur (only once moved to another focusable element and activated that element) |
| Windows 8 / Opera 20 (Blink) + JAWS 15 gesture navigation (no visible outline / focus indication) [touch explore not working] | none |
focus > mousedown > mouseup > click |
blur > focus > mousedown > mouseup > click |
blur (only once moved to another focusable element and activated that element) |
| Windows 8 / Opera 20 (Blink) + NVDA 2014.1 gesture navigation and touch explore (no visible outline / focus indication) | none |
focus > mousedown > mouseup > click |
mousedown > mouseup > click |
blur (only once moved to another focusable element and activated that element) |
| Windows 8 / Opera 20 (Blink) + Narrator gesture navigation [touch explore not working] | none |
focus > mousedown > mouseup > click |
blur > focus > mousedown > mouseup > click |
blur (only once moved to another focusable element and activated that element) |
Using a desktop screenreader with a touchscreen and touch gestures (swipe left/right and using "touch explore", similar to mobile/tablet screenreaders), none of the tested combinations of browser/AT fired a focus event when moving the focus outline to an element – focus is only sent as a result of a double-tap activation.
Opera 12 (Presto) on Windows seems to have no support for assistive technology. Chrome+ChromeVox does not currently support touch swipes/gestures on desktop.
As noted in the "Desktop with assistive technology" and "Desktop with touchscreen and assistive technology" sections, even when not using a traditional pointing device, certain combinations of browser/AT generate "fake" mouse events for compatibility with legacy sites/scripts that hang behavior on traditional mouse events.
As part of an admittedly philosophical discussion on whether or not setting focus with a keyboard or screenreader (jumping from one focusable element to the next, usually in linear tab order) could also be considered an act of "pointing" (and as such should generate pointer events - see Bug 24786 - ACTION-64: Propose a non-normative note re the keyboard compat issue), I tested if these "faked" events, as well as the final click, also carry any coordinates in their event object.
Any combinations of browser/AT not listed in this table do not generate "fake" mouse events, and any traditional focus, click, blur events they do fire do not contain any coordinates in their event object, as would be the case with regular keyboard interactions.
| Browser | Events fired on activation (unless otherwise noted) |
Coordinates |
|---|---|---|
| iOS7.1 / Safari/WebView + VoiceOver | touchstart > touchend > mouseover > mousemove > mousedown > (blur) > mouseup > click mouseleave > mouseout(when moving to another focusable/activatable element) |
center of element center of the new element that received focus (when moving to another focusable/activatable element) |
| Android 4.3 / Chrome M34 + TalkBack (effectively ChromeVox) only touch explore | mouseenter > mouseover > (mousemove)+ > (focus)(when moving to element using "touch explore") ( mousemove)+ > mouseleave > mouseout(when moving away from element using "touch expore") |
screenX/screenY are 0clientX/clientY and pageX/pageY correspond to finger position |
| Android 4.3 / Firefox 28 + TalkBack using swipe gestures | touchstart > mousedown > (focus) > touchend > mouseup > click |
center of element |
| Android 4.3 / Firefox 28 + TalkBack using touch explore | mouseover(when moving to element using "touch explore") mouseout(when moving away from element using "touch expore") |
finger position |
| Windows 8 / Chrome 34 + ChromeVox 1.34.1 | mousedown > mousemup > click (using ChromeVox+SPACE) |
none |
| Windows 8 / Chrome 34 + JAWS 15 | mousedown > mouseup > click |
none |
| Windows 8 / Chrome 34 + JAWS 15 gesture navigation | mousedown > mouseup > click |
none |
| Windows 8 / Chrome 34 + NVDA 2014.1 | mousedown > mouseup > click (using SPACE) |
none |
| Windows 8 / Chrome 34 + NVDA 2014.1 gesture navigation | mousedown > mouseup > click |
none |
| Windows 8 / Chrome 34 + Narrator gesture navigation | mousedown > mouseup > click |
none |
| Windows 8 / Firefox 28 + JAWS 15 | mousedown > mouseup > click |
center of element |
| Windows 8 / Firefox 28 + JAWS 15 gesture navigation | mousedown > mouseup > click |
center of element |
| Windows 8 / Firefox 28 + NVDA 2014.1 | mousedown > mouseup > click |
center of element |
| Windows 8 / Firefox 28 + NVDA 2014.1 gesture navigation | mousedown > mouseup > click |
center of element |
| Windows 8 / Firefox 28 + Narrator touchscreen | mousedown > mouseup > click |
center of element |
| Windows 8 / Opera 20 (Blink) + Narrator gesture navigation | mousedown > mouseup > click |
none |
| Windows 8 / Opera 20 (Blink) + JAWS 15 gesture navigation | mousedown > mouseup > click |
none |
| Windows 8 / Opera 20 (Blink) + NVDA 2014.1 | mousedown > mouseup > click |
none |
| Windows 8 / Opera 20 (Blink) + NVDA 2014.1 gesture navigation | mousedown > mouseup > click |
none |
| Windows 8 / Opera 12 (Presto) Spatial Navigation | focus > mouseenter > mouseover > mousemove (when focusing) click (when activating) mouseout > mouseleave > blur (when leaving) |
top left corner of element |
One interesting result which is not included in this table (as it's likely a bug): even for traditional keyboard navigation (with and without Narrator), IE11 passes along coordinates in the event object for the click event when an element is activated. However, these coordinates are meaningless - see Bug 856583: IE11 click event has strange/illogical screenX/screenY, clientX/clientY, pageX/pageY coordinates:
screenX/screenY are 0screenX/screenY are screen coordinates of top left corner of the browser viewportclientX/clientY and pageX/pageY contain negative values, the inverse of the coordinates of the top left corner of browser viewport