The source code

    /**
     * @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']
        });