/**
* @ignore
* gesture single tap double tap
* @author yiminghe@gmail.com
*/
KISSY.add('event/dom/touch/double-tap',
function (S, eventHandleMap, Event, SingleTouch) {
var SINGLE_TAP = 'singleTap',
DOUBLE_TAP = 'doubleTap',
// same with native click delay
MAX_DURATION = 300;
function DoubleTap() {
}
S.extend(DoubleTap, SingleTouch, {
onTouchStart: function (e) {
var self = this;
if (DoubleTap.superclass.onTouchStart.apply(self, arguments) === false) {
return false;
}
self.startTime = e.timeStamp;
if (self.singleTapTimer) {
clearTimeout(self.singleTapTimer);
self.singleTapTimer = 0;
}
},
onTouchMove: function () {
return false;
},
onTouchEnd: function (e) {
var self = this,
lastEndTime = self.lastEndTime,
time = e.timeStamp,
target = e.target,
touch = e.changedTouches[0],
duration = time - self.startTime;
self.lastEndTime = time;
// second touch end
if (lastEndTime) {
// time between current up and last up
duration = time - lastEndTime;
// a double tap
if (duration < MAX_DURATION) {
// a new double tap cycle
self.lastEndTime = 0;
Event.fire(target, DOUBLE_TAP, {
touch: touch,
duration: duration/1000
});
return;
}
// else treat as the first tap cycle
}
// time between down and up is long enough
// then a singleTap
duration = time - self.startTime;
if (duration > MAX_DURATION) {
Event.fire(target, SINGLE_TAP, {
touch: touch,
duration: duration/1000
})
} else {
// buffer singleTap
// wait for a second tap
self.singleTapTimer = setTimeout(function () {
Event.fire(target, SINGLE_TAP, {
touch: touch,
duration: duration/1000
});
}, MAX_DURATION);
}
}
});
eventHandleMap[SINGLE_TAP] = eventHandleMap[DOUBLE_TAP] = new DoubleTap();
return DoubleTap;
}, {
requires: ['./handle-map', 'event/dom/base', './single-touch']
});