From 1fed2eb19d3a3c15e1cb8fbe239f0c2f581eb578 Mon Sep 17 00:00:00 2001 From: Satyen Desai Date: Sun, 24 Jul 2011 16:02:18 -0700 Subject: [PATCH] Reset start time on first move, to fix use case where use mousedowns, touchstarts but doesn't move their finger for a while. Fixes #2530187 Still need to fix the case where user changes direction before mouseup/touchend. See #2530220. --- src/event-gestures/HISTORY.md | 4 +++- src/event-gestures/js/Flick.js | 32 ++++++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/event-gestures/HISTORY.md b/src/event-gestures/HISTORY.md index e9eab364bd7..a9af2261a81 100644 --- a/src/event-gestures/HISTORY.md +++ b/src/event-gestures/HISTORY.md @@ -4,7 +4,9 @@ Gestures 3.4.0 ----- - * No changes + * For flick, reset start time on first move, to handle + case where user mousesdown/touchstarts but then doesn't + move their finger for 5s leading to inaccurate velocity. 3.3.0 ----- diff --git a/src/event-gestures/js/Flick.js b/src/event-gestures/js/Flick.js index d88ac0fa5e7..29a4ae99d56 100644 --- a/src/event-gestures/js/Flick.js +++ b/src/event-gestures/js/Flick.js @@ -19,14 +19,17 @@ var EVENT = ("ontouchstart" in Y.config.win && !Y.UA.chrome) ? { start: "touchstart", - end: "touchend" + end: "touchend", + move: "touchmove" } : { start: "mousedown", - end: "mouseup" + end: "mouseup", + move: "mousemove" }, START = "start", END = "end", + MOVE = "move", OWNER_DOCUMENT = "ownerDocument", MIN_VELOCITY = "minVelocity", @@ -36,6 +39,7 @@ var EVENT = ("ontouchstart" in Y.config.win && !Y.UA.chrome) ? { _FLICK_START = "_fs", _FLICK_START_HANDLE = "_fsh", _FLICK_END_HANDLE = "_feh", + _FLICK_MOVE_HANDLE = "_fmh", NODE_TYPE = "nodeType"; @@ -122,6 +126,7 @@ Y.Event.define('flick', { var start = true, // always true for mouse endHandle, + moveHandle, doc, preventDefault = subscriber._extra.preventDefault, origE = e; @@ -148,12 +153,22 @@ Y.Event.define('flick', { endHandle = subscriber[_FLICK_END_HANDLE]; + doc = (node.get(NODE_TYPE) === 9) ? node : node.get(OWNER_DOCUMENT); if (!endHandle) { - doc = (node.get(NODE_TYPE) === 9) ? node : node.get(OWNER_DOCUMENT); - endHandle = doc.on(EVENT[END], Y.bind(this._onEnd, this), null, node, subscriber, ce); subscriber[_FLICK_END_HANDLE] = endHandle; } + + subscriber[_FLICK_MOVE_HANDLE] = doc.once(EVENT[MOVE], Y.bind(this._onMove, this), null, node, subscriber, ce); + } + }, + + _onMove: function(e, node, subscriber, ce) { + var start = subscriber[_FLICK_START]; + + // Start timing from first move. + if (start && start.flick) { + start.flick.time = new Date().getTime(); } }, @@ -170,7 +185,13 @@ Y.Event.define('flick', { xyDistance, distance, velocity, - axis; + axis, + moveHandle = subscriber[_FLICK_MOVE_HANDLE]; + + if (moveHandle) { + moveHandle.detach(); + delete subscriber[_FLICK_MOVE_HANDLE]; + } if (valid) { @@ -198,7 +219,6 @@ Y.Event.define('flick', { endTime = new Date().getTime(); time = endTime - startTime; - xyDistance = [ endEvent.pageX - start.pageX, endEvent.pageY - start.pageY