docs: function handleTouchStart(e) {
        var this$1 = this;
  
        isMoved = false;
        tapHoldFired = false;
        if (e.targetTouches.length > 1) {
          if (activableElement) { removeActive(); }
          return true;
        }
        if (e.touches.length > 1 && activableElement) {
          removeActive();
        }
        if (params.tapHold) {
          if (tapHoldTimeout) { clearTimeout(tapHoldTimeout); }
          tapHoldTimeout = setTimeout(function () {
            if (e && e.touches && e.touches.length > 1) { return; }
            tapHoldFired = true;
            e.preventDefault();
            $(e.target).trigger('taphold');
          }, params.tapHoldDelay);
        }
        if (needsFastClickTimeOut) { clearTimeout(needsFastClickTimeOut); }
        needsFastClick = targetNeedsFastClick(e.target);
  
        if (!needsFastClick) {
          trackClick = false;
          return true;
        }
        if (Device.ios || (Device.android && 'getSelection' in win)) {
          var selection = win.getSelection();
          if (
            selection.rangeCount
            && selection.focusNode !== doc.body
            && (!selection.isCollapsed || doc.activeElement === selection.focusNode)
          ) {
            activeSelection = true;
            return true;
          }
  
          activeSelection = false;
        }
        if (Device.android) {
          if (androidNeedsBlur(e.target)) {
            doc.activeElement.blur();
          }
        }
  
        trackClick = true;
        targetElement = e.target;
        touchStartTime = (new Date()).getTime();
        touchStartX = e.targetTouches[0].pageX;
        touchStartY = e.targetTouches[0].pageY;
  
        // Detect scroll parent
        if (Device.ios) {
          scrollParent = undefined;
          $(targetElement).parents().each(function () {
            var parent = this$1;
            if (parent.scrollHeight > parent.offsetHeight && !scrollParent) {
              scrollParent = parent;
              scrollParent.f7ScrollTop = scrollParent.scrollTop;
            }
          });
        }
        if ((touchStartTime - lastClickTime) < params.fastClicksDelayBetweenClicks) {
          e.preventDefault();
        }
  
        if (params.activeState) {
          activableElement = findActivableElement(targetElement);
          activeTimeout = setTimeout(addActive, 0);
        }
        if (useRipple) {
          rippleTouchStart(targetElement, touchStartX, touchStartY);
        }
        return true;
      }