docs: function touchstartHandler(event) {
  
    if (Object.keys(gestures).length === 0) {
      docEl.addEventListener('touchmove', touchmoveHandler, false)
      docEl.addEventListener('touchend', touchendHandler, false)
      docEl.addEventListener('touchcancel', touchcancelHandler, false)
    }
  
    // record every touch
    for (var i = 0; i < event.changedTouches.length; i++) {
      var touch = event.changedTouches[i]
      var touchRecord = {}
  
      for (var p in touch) {
        touchRecord[p] = touch[p]
      }
  
      var gesture = {
        startTouch: touchRecord,
        startTime: Date.now(),
        status: 'tapping',
        element: event.srcElement || event.target,
        pressingHandler: setTimeout(function (element, touch) {
          return function () {
            if (gesture.status === 'tapping') {
              gesture.status = 'pressing'
  
              fireEvent(element, 'longpress', {
                // add touch data for jud
                touch: touch,
                touches: event.touches,
                changedTouches: event.changedTouches,
                touchEvent: event
              })
            }
  
            clearTimeout(gesture.pressingHandler)
            gesture.pressingHandler = null
          }
        }(event.srcElement || event.target, event.changedTouches[i]), 500)
      }
      gestures[touch.identifier] = gesture
    }
  
    if (Object.keys(gestures).length == 2) {
      var elements = []
  
      for (var p in gestures) {
        elements.push(gestures[p].element)
      }
  
      fireEvent(getCommonAncestor(elements[0], elements[1]), 'dualtouchstart', {
        touches: slice.call(event.touches),
        touchEvent: event
      })
    }
  }