patrick h. lauke - getting touchy; an introduction to touch and pointer events

206
getting touchy AN INTRODUCTION TO TOUCH AND POINTER EVENTS Patrick H. Lauke / DevConFu / Jūrmala, Latvia / 29 May 2014

Upload: devconfu

Post on 13-May-2015

229 views

Category:

Software


0 download

DESCRIPTION

Beyond smartphones and tablets, touchscreens are finding their way into laptops and even desktop computers. With hardware support for touch becoming increasingly ubiquitous, it's time to explore what new possibilities are available to developers. This session will cover the basics of handling touch events - from making sure simple single-tap interactions are as responsive as possible, all the way to full multitouch, gesture-enabled, cross-browser interface elements.

TRANSCRIPT

Page 1: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

getting touchyAN INTRODUCTION TO TOUCH AND POINTER EVENTS

Patrick H. Lauke / DevConFu / Jūrmala, Latvia / 29 May 2014

Page 2: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch

Page 3: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Touch/pointer events test results

Page 4: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

“how can I make my websitework on touch devices?”

Page 5: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

you don't need touch eventsbrowsers emulate regular

mouse events

Page 8: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

compatibility mouse events(mouseenter) > mouseover > mousemove* > mousedown >

(focus) > mouseup > click

* only a single “sacrificial” mousemove event fired

Page 9: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

on first tap(mouseenter) > mouseover > mousemove >

mousedown > (focus) > mouseup > click

subsequent tapsmousemove > mousedown > mouseup > click

tapping awaymouseout > (blur)

focus / blur only on focusable elements in Firefoxmouseout not on iOS Safari/WebView (e.g. iOS Chrome)

Opera Mobile and

Page 10: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

emulation works,but is limiting/problematic

Page 11: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

1.  delayed event dispatch2.  mousemove doesn't track

Page 12: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

1.  delayed event dispatch2.  mousemove doesn't track

Page 13: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener_show-delay.html

Page 14: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener_show-delay.html

Page 15: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

1.  delayed event dispatch2.  mousemove doesn't track

Page 16: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/particle/2

Page 17: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/particle/2

(iOS7 bug: moving finger fires mousemove on scroll)

Page 18: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

“we need to go deeper...”

Page 19: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touch events

introduced by Apple, adoptedin Chrome/Firefox/Opera

www.w3.org/TR/touch-events

Page 20: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touchstarttouchmovetouchend

touchcancel

touchentertouchleave

Page 21: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener_all-no-timings.html

Page 22: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener_all-no-timings.html

Bug 128534 - 'mouseenter' mouse compat event not fired...

Page 23: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

events fired on taptouchstart > [touchmove]+ > touchend >

(mouseenter) > mouseover > mousemove > mousedown >(focus) > mouseup > click

(mouse events only fired for single-finger tap)

Page 24: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

on first taptouchstart > [touchmove]+ > touchend >

(mouseenter) > mouseover > mousemove > mousedown >(focus) > mouseup > click

subsequent tapstouchstart > [touchmove]+ > touchend >mousemove > mousedown > mouseup > click

tapping awaymouseout > (mouseleave) > (blur)

Page 25: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

•  too many touchmove events prevent mouse compatibility events

after touchend (not considered a "clean" tap)

•  too many touchmove events on activatable elements can lead to

touchcancel (in old Chrome/Browser versions)

•  not all browsers consistently send the touchmove

some browsers outright weird...

Page 26: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Browser/Android 4.3(AppleWebKit/534.30)

mouseover > mousemove > touchstart > touchend >mousedown > mouseup > click

Browser/Blackberry PlayBook 2.0(AppleWebKit/536.2)

touchstart > mouseover > mousemove > mousedown >touchend > mouseup > click

Page 27: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Touch/pointer events test results

Page 28: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touch eventsvs

limitations/problems

Page 29: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

1.  delayed event dispatch2.  mousemove doesn't track

Page 30: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

1.  delayed event dispatch2.  mousemove doesn't track

Page 31: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener_show-delay.html

Page 32: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

why the delay?double-tap to zoom

(mostly anyway)

Page 33: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

what if browsers didn't wait?

Page 34: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Puffin/Android double-tap zooms and fires mouse events + click(also, doesn't support touch events)

Page 35: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Try it out in Chrome? chrome://flags/

Page 36: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

when does the delay happen?

Page 37: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener.html

Page 38: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touch / mouse events delaytouchstart > [touchmove]+ > touchend >

[300ms delay]

(mouseenter) > mouseover > mousemove > mousedown >(focus) > mouseup > click

Page 39: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

“how can we make it feelresponsive like a native app?”

Page 40: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

react to events fired before the300ms delay...

Page 41: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touchstart for an “immediate”control

(fire/jump button on a game)

Page 42: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touchend for a control thatfires after finger lifted

Page 43: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

interlude: simple featuredetection for touch events

Page 44: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* feature detection for touch events */

if ( 'ontouchstart' in window ) { /* some clever stuff here */}

/* older browsers have flaky support so more hacky tests needed...use Modernizr.touch or similar */

Page 45: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* common performance “trick” */

var clickEvent = ( 'ontouchstart' in window ? 'touchend' : 'click' );

blah.addEventListener( clickEvent , function() { ... }, false);

Page 46: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

don't make it touch-exclusive

Page 47: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* common performance “trick” */

var clickEvent = ( 'ontouchstart' in window ? 'touchend' : 'click');

...

/* if touch events are supported, only listen to touchend, not click */

Page 48: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

hybrid devicestouch + mouse + keyboard

Page 49: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events
Page 50: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events
Page 51: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events
Page 52: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events
Page 53: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events
Page 54: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Android + mouse – behaves like touchtouchstart > touchend > mouseover > mousemove > mousedown >

(focus) > mouseup > click

Page 55: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Blackberry PlayBook 2.0 + mouse - like desktopmouse mouseover > mousedown > mousemove > mouseup > click

Page 56: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Android + keyboard – like desktop keyboardfocus > click

Page 57: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

iOS + VoiceOver (with/without keyboard) – similar to touchfocus > touchstart > touchend > (mouseenter) > mouseover >

mousemove > mousedown > blur > mouseup > click

Page 58: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Android + TalkBack – keyboard/mouse hybridfocus > blur > mousedown > mouseup > click > focus(?)

Page 59: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

hacks.mozilla.org - Detecting touch [...]

Page 60: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* feature detection for touch events */

if ('ontouchstart' in window) { /* browser supports touch events but user is not necessarily using touch (exclusively) */

/* it could be a mobile, tablet, desktop, fridge ... */}

Page 61: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touch or mouse or keyboard

Page 62: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touch and mouse and keyboard

Page 63: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* doubled-up event listeners */

foo.addEventListener(' touchend ', someFunction, false);foo.addEventListener(' click ', someFunction, false);

Page 64: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* prevent delay + mouse events */

foo.addEventListener(' touchstart ', function(e) { e.preventDefault();}, false);

/* doubled-up event listeners */

foo.addEventListener('touchend', someFunction, false);foo.addEventListener('click', someFunction, false);

Page 65: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

preventDefault() killsscrolling, pinch/zoom, etc

Page 66: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

apply preventDefault()carefully

(just on buttons/links, not entire page)

Page 67: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

github.com/ftlabs/fastclick

Page 68: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

browsers working to removedouble-tap to zoom delay

(when page not zoomable)

Page 69: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

<meta name="viewport" content="user-scalable=no">patrickhlauke.github.io/touch/tests/event-listener_user-scalable-no.html

Page 70: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

<meta name="viewport" content="user-scalable=no">patrickhlauke.github.io/touch/tests/event-listener_user-scalable-no.html

Page 71: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

... content="minimum-scale=1, maximum-scale=1"patrickhlauke.github.io/touch/tests/event-listener_minimum-maximum-scale.html

Page 72: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

... content="minimum-scale=1, maximum-scale=1"patrickhlauke.github.io/touch/tests/event-listener_minimum-maximum-scale.html

Page 73: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Bug 922896 - Optimizations to remove 300ms [...] delay[RESOLVED - FIXED]

Page 74: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

what about accessibility?

Page 75: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events
Page 76: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener_user-scalable-no.html

Page 77: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Chrome 32+ / Android: ... content="width=device-width"updates.html5rocks.com/2013/12/300ms-tap-delay-gone-away

Page 78: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Bug 941995 - Remove 300ms [...] on "responsive" pages

Page 79: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener_user-scalable-no.html

Page 80: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

iOS/Safari designed themselves into a corner: “double-tap to scroll”bugs.webkit.org/show_bug.cgi?id=122212

Page 81: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

1.  delayed event dispatch2.  mousemove doesn't track

Page 82: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/particle/2

Page 83: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/particle/2(iOS7 bug: moving finger fires mousemove on scroll)

Page 84: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

events fired on taptouchstart > [touchmove]+ > touchend >

(mouseenter) > mouseover >mousemove* > mousedown > (focus) >

mouseup > click

* mouse event emulation fires only a single mousemove

too many touchmove events prevent mouse compatibility events after touchend

Page 85: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

doubling up handling ofmousemove and touchmove

Page 86: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

var posX, posY;...function positionHandler(e) { posX = e.clientX ; posY = e.clientY ;}...canvas.addEventListener(' mousemove ', positionHandler, false);

Page 87: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

var posX, posY;...function positionHandler(e) { /* handle both mouse and touch */}...canvas.addEventListener(' mousemove ', positionHandler, false);canvas.addEventListener(' touchmove ', positionHandler, false);

Page 88: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

interface MouseEvent : UIEvent { readonly attribute long screenX ; readonly attribute long screenY ; readonly attribute long clientX ; readonly attribute long clientY ; readonly attribute boolean ctrlKey; readonly attribute boolean shiftKey; readonly attribute boolean altKey; readonly attribute boolean metaKey; readonly attribute unsigned short button; readonly attribute EventTarget relatedTarget; void initMouseEvent(...);};

www.w3.org/TR/DOM-Level-2-Events/events.html#Events-MouseEvent

Page 89: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

partial interface MouseEvent { readonly attribute double screenX; readonly attribute double screenY; readonly attribute double pageX ; readonly attribute double pageY ; readonly attribute double clientX; readonly attribute double clientY; readonly attribute double x ; readonly attribute double y ; readonly attribute double offsetX ; readonly attribute double offsetY ;};

www.w3.org/TR/cssom-view/#extensions-to-the-mouseevent-interface

Page 90: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

interface TouchEvent : UIEvent { readonly attribute TouchList touches ; readonly attribute TouchList targetTouches ; readonly attribute TouchList changedTouches ; readonly attribute boolean altKey; readonly attribute boolean metaKey; readonly attribute boolean ctrlKey; readonly attribute boolean shiftKey;};

www.w3.org/TR/touch-events/#touchevent-interface

Page 91: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

interface Touch { readonly attribute long identifier; readonly attribute EventTarget target; readonly attribute long screenX ; readonly attribute long screenY ; readonly attribute long clientX ; readonly attribute long clientY ; readonly attribute long pageX ; readonly attribute long pageY ;};

www.w3.org/TR/touch-events/#touch-interface

Page 92: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touches

all touch points on screen

targetTouches

all touch points that started on the element

changedTouches

touch points that caused the event to fire

Page 93: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/touchlist-objects

Page 94: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

var posX, posY;...function positionHandler(e) { if ((e.clientX)&&(e.clientY)) { posX = e.clientX; posY = e.clientY; } else if (e.targetTouches) { posX = e.targetTouches[0].clientX; posY = e.targetTouches[0].clientY; e.preventDefault() ; }}...canvas.addEventListener('mousemove', positionHandler, false );canvas.addEventListener('touchmove', positionHandler, false );

Page 95: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/particle/3

Page 96: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

tracking finger movement overtime ... swipe gestures

Page 97: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/swipe

Page 98: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/picture-slider

Page 99: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

don't forget mouse/keyboard!

Page 100: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

bradfrostweb.com/demo/mobile-first

Page 101: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touchmove fires...a lot!

Page 102: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

do absolute minimum on eachtouchmove

(usually: store coordinates)

Page 103: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

heavy JavaScript onsetInterval or

requestAnimationFrame

Page 104: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/touch-limit

Page 105: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

why stop at a single point?multitouch support

Page 106: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

interface TouchEvent : UIEvent { readonly attribute TouchList touches ; readonly attribute TouchList targetTouches ; readonly attribute TouchList changedTouches ; readonly attribute boolean altKey; readonly attribute boolean metaKey; readonly attribute boolean ctrlKey; readonly attribute boolean shiftKey;};

www.w3.org/TR/touch-events/#touchevent-interface

Page 107: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* iterate over touch array */

for (i=0; i< e.targetTouches .length; i++) { ... posX = e.targetTouches[i].clientX ; posY = e.targetTouches[i].clientY ; ...}

Page 108: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tracker/multi-touch-tracker.html

Page 109: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

iOS/iPad preventDefault()can't override 4-finger

gestures

Page 110: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

iOS7/Safari preventDefault()can't override back/forward

swipe gestures

Page 111: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

multitouch gestures

Page 112: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* iOS/Safari/WebView has gesture events for size/rotation,not part of the W3C Touch Events spec. */

gesturestart / gesturechange / gestureend

function(e) { /* e.scale e.rotation */}

/* not supported in Chrome/Firefox/Opera */

Page 113: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* with some trigonometry we can replicate these from basic principles. */

var distance = Math.sqrt(Math.pow(...)+Math.pow(...));var angle = Math.atan2(...);

Page 114: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/picture-organiser

Page 115: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

not all old/cheap devices/OSssupport multitouch!

Page 116: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

HTC Hero – Android 2.1

Page 117: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

LG Optimus 2X – Android 2.3.7

Page 118: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

ZTE Open – Firefox OS 1.1

Page 119: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

what about Internet Explorer?

Page 120: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

up to IE9 (Win7 / WinPhone7.5)only mouse events

Page 121: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

in IE10 Microsoft introducedPointer Events

Page 123: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

not just some“not invented here”

technology

Page 124: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Pointer Events - W3C Candidate Recommendation 09 May 2013

Page 125: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Pointer Events - W3C Editor's Draft 14 May 2014

Page 127: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Issue 162757: Implement pointer events in Chrome behind experimental flag

Page 128: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Bug 822898 - Implement pointer events

Page 129: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

...what about Apple?

Page 130: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Bug 105463 - Implement pointer events RESOLVED WONTFIX

Page 131: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener_all-no-timings.html

Page 132: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener_all-no-timings.html

Page 133: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

events fired on tapmousemove* >

pointerover > mouseover >pointerenter > mouseenter >pointerdown > mousedown >pointermove > mousemove >

gotpointercapture >focus >

pointerup > mouseup >lostpointercapture >

pointerout > mouseout >pointerleave > mouseleave >

click

mouse events fired “inline” with pointer events(for a primary pointer, e.g. first finger on screen)

Page 134: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

vendor-prefixed in IE10MSPointerDown etc

navigator.msMaxTouchPoints-ms-touch-action

unprefixed in IE11 (but prefixed versions still mapped for compatibility)

Page 135: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* Pointer Events extend Mouse Events vs Touch Events and their completely new objects/arrays */

interface PointerEvent : MouseEvent { readonly attribute long pointerId; readonly attribute long width; readonly attribute long height; readonly attribute float pressure; readonly attribute long tiltX; readonly attribute long tiltY; readonly attribute DOMString pointerType; readonly attribute boolean isPrimary;}

/* plus all the classic MouseEvent attributes like clientX , clientY , etc */

Page 136: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

simple feature detection forpointer events

Page 137: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* detecting pointer events support */

if ( window.PointerEvent ) { /* some clever stuff here but this covers touch, stylus, mouse, etc */}

/* still listen to click for keyboard! */

Page 138: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events
Page 139: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* detect maximum number of touch points */

if ( navigator.maxTouchPoints > 0 ) { /* device with a touchscreen */}

if ( navigator.maxTouchPoints > 1 ) { /* multitouch-capable device */}

Page 140: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

are pointer events better?

Page 141: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

no need for separate mouse ortouch event listeners

Page 142: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* touch events: separate handling */

foo.addEventListener('touchmove', ... , false);foo.addEventListener('mousemove', ... , false);

/* pointer events: single listener for mouse, stylus, touch */

foo.addEventListener(' pointermove ', ... , false);

Page 143: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

no need for separate mouse ortouch code to get x / y coords

Page 144: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* Pointer Events extend Mouse Events */

foo.addEventListener(' pointermove ', function(e) { ... posX = e.clientX ; posY = e.clientY ; ...}, false);

www.w3.org/TR/pointerevents/#pointerevent-interface

Page 145: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

but you can distinguish mouseor touch or stylus if needed

Page 146: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

foo.addEventListener('pointermove', function(e) { ... switch( e.pointerType ) { case ' mouse ': ... break; case ' pen ': ... break; case ' touch ': ... break; default : /* future-proof */ } ...} , false);

Page 147: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

pointer eventsvs

limitations/problems of mouseevent emulation

Page 148: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

1.  delayed event dispatch2.  mousemove doesn't track

Page 149: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

1.  delayed event dispatch2.  mousemove doesn't track

Page 150: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener_show-delay.html(IE/Win8 has double-tap to zoom, so problem on desktop too)

Page 151: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener.html

Page 152: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener.html

Page 153: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

pointer / mouse events and delaymousemove >

pointerover > mouseover >pointerenter > mouseenter >pointerdown > mousedown >pointermove > mousemove >

gotpointercapture >focus >

pointerup > mouseup >lostpointercapture >

pointerout > mouseout >pointerleave > mouseleave >

[300ms delay]click

Page 154: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

“how can we make it feelresponsive like a native app?”

Page 155: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

we could try a similarapproach to touch events...

Page 156: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

•  double-up listeners - pointerup and click

•  prevent code firing twice - preventDefault

preventDefault() on pointerdown stops mouse compatibilityevents, but click is not considered mouse compatibility event

Page 157: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener.html

Page 158: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touch-action

Page 159: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

CSS propertytouch-action: auto | none | [ pan-x || pan-y ] | manipulation

www.w3.org/TR/pointerevents/#the-touch-action-css-propertyonly prevents default touch action (e.g. double-tap to zoom) does not

stop synthetic mouse events nor click

Page 160: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touch-action:none killsscrolling, long-press,

pinch/zoom

Page 161: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touch-action:manipulation

Page 162: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tests/event-listener_touch[...]

Page 163: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Bug 979345 - Implement touch-action:manipulation [...]

Page 164: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Issue 349016: Add support for touch-action:manipulation

chrome://flags/#enable-experimental-web-platform-features (Chrome 35)

Page 165: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Bug 133114 - Implement " touch-action:manipulation " [...]

Page 166: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

1.  delayed event dispatch2.  mousemove doesn't track

Page 167: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/particle/2

Page 168: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touch-action:none

Page 169: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/particle/2a

Page 170: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

what about multitouch?

Page 171: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* PointerEvents don't have the handy TouchList objects, so we have to replicate something similar... */

var points = [];switch (e.type) { case ' pointerdown ': /* add to the array */ break; case ' pointermove ': /* update the relevant array entry's x and y */ break; case ' pointerup ': /* remove the relevant array entry */ break;}

Page 172: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

patrickhlauke.github.io/touch/tracker/multi-touch-tracker-pointer.html

(note multiple isPrimary pointers)

Page 173: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* like iOS/Safari, IE/Win has higher-level gestures , but these are not part of the W3C Pointer Events spec.

Replicate these from basic principles again... */

Page 174: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* advanced topic: pointer capture */

gotpointercapture / lostpointercapture

element.setPointerCapture(pointerId)

patrickhlauke.github.io/touch/tests/pointercapture.html

Page 175: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

what about backwards-compatibility?

Page 176: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

touchstart > [touchmove]+ > touchend >[300ms delay] >

mouseover > mousemove > mousedown > mouseup > click

vs

pointerover > mouseover > pointerdown > mousedown >pointermove > mousemove > pointerup > mouseup >pointerout > mouseout > [300ms delay] > click

Page 177: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

W3C Touch Events Community Group

Page 178: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* cover all cases (hat-tip Stu Cox) */

if ('onpointerdown' in window) {

/* bind to Pointer Events: pointerdown, pointerup, etc */

} else {

/* bind to mouse events: mousedown, mouseup, etc */

if ('ontouchstart' in window) { /* bind to Touch Events: touchstart, touchend, etc */ }}

/* bind to keyboard / click */

Page 179: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

polyfills for pointer events(code for tomorrow, today)

Page 181: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

www.catuhe.com/msdn/handjs/

Page 183: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

GitHub - Polymer/PointerEvents

Page 184: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* Polymer's PointerEvents are not fired unless an element has a (custom) touch-action attribute */

<div id="foo" touch-action="none" ></div>

Page 185: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

utility libraries(because life is too short to hand-code gesture support)

Page 187: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

/* Hammer's high-level events example */

var element = document.getElementById('test_el');

var hammertime = Hammer(element).on("swipeleft swiperight", function(event) { /* handle horizontal swipes */});

Page 188: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

jQuery Mobile? Sencha Touch?check for support of IE10+

and “this is a touch device”

assumptions

Page 189: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

debugging/testing

Page 190: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Chrome DevTools / Using the Console / Monitoring events

Page 191: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

chrome://flags/#touch-events

Page 192: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

beware inaccurate emulation

Page 193: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Issue 181204: [...] event order different from real devicesFixed in Chrome (Canary) 37

Page 194: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Bug 920956 - DevTools touch emulation: suppress regular mouse events ...

Page 195: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

beware inaccurateimplementation

Page 196: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events
Page 197: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Bug 861876 - [...] multiple mousemoves being fired

Page 198: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

Bug 861876 - [...] preventDefault on touchstart doesn't stop synthetic mouse events

Page 199: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events
Page 200: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

further reading...

Page 201: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

•  Matt Gaunt – Touch Feedback for Mobile Sites

•  Jonathan Stark – FastActive

•  Stephen Woods – HTML5 Touch Interfaces

•  Chris Wilson + Paul Kinlan – Touch And Mouse: Together Again For

The First Time

•  Ryan Fioravanti – Creating Fast Buttons for Mobile Web Applications

•  Boris Smus – Multi-touch Web Development

•  Boris Smus – Generalized input on the cross-device web

•  Boris Smus – Interactive touch laptop experiments

Page 202: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

•  Rick Byers + Boris Smus (Google I/O) – Point, Click, Tap, Touch -

Building Multi-Device Web Interfaces

•  Grant Goodale – Touch Events

•  W3C – Touch Events Extensions

•  Mozilla Developer Network – Touch Events

•  WebPlatform.org – Pointer Events

•  Rick Byers – The best way to avoid the dreaded 300ms click delay is

to disable double-tap zoom

•  Chromium Issue 152149: All touch-event related APIs should exist if

touch support is enabled at runtime

Page 203: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

•  Tim Kadlec – Avoiding the 300ms Click Delay, Accessibly

•  Microsoft – Pointer events updates (differences between IE10-IE11)

•  Patrick H. Lauke – Webseiten zum Anfassen

•  Patrick H. Lauke – Drei unter einem Dach: Pointer-Events für Maus,

Stylus und Touchscreen

•  Patrick H. Lauke – Make your site work on touch devices

•  Stu Cox – You can't detect a touchscreen

•  Tilo Mitra – The State of Gestures

•  Microsoft – Hover touch support (IE10/IE11)

•  W3C Media Queries Level 4 – pointer

Page 204: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

•  Stu Cox – The Good & Bad of Level 4 Media Queries

•  Peter-Paul Koch – Touch table

•  Peter-Paul Koch – Preventing the touch default

•  Peter-Paul Koch – Mouse event bubbling in iOS

•  Edge Conference (Feb 2013 London) – Panel: Input

•  Edge Conference (Mar 2014 London) – Panel: Pointers and Interactions

•  Trent Walton – Device-Agnostic

•  Stu Cox – The Golden Pattern for Handling Touch Input

•  Matt Gaunt – ‘Focusing’ on the Web Today

•  Mobiscroll – Working with touch events

Page 205: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

youtube.com/watch?v=AZKpByV5764

Page 206: Patrick H. Lauke - Getting Touchy; an introduction to touch and pointer events

get in touch@patrick_h_lauke

github.com/patrickhlauke/touchpatrickhlauke.github.io/getting-touchy-presentation

slideshare.net/reduxpaciellogroup.com

splintered.co.uk