5

Angular TouchngTouch会导致点击在触摸释放时发生。

有没有办法让点击发生在触摸开始?

下面的fast-click指令似乎可以在触摸屏上执行我想要的操作,但它不适用于鼠标单击。

myApp.directive('fastClick', ['$parse', function ($parse) {
    return function (scope, element, attr) {
      var fn = $parse(attr['fastClick']);
      var initX, initY, endX, endY;
      var elem = element;

      elem.bind('touchstart', function (event) {
          event.preventDefault();
          initX = endX = event.touches[0].clientX;
          initY = endY = event.touches[0].clientY;
          scope.$apply(function () { fn(scope, { $event: event }); });
      });
    };
  }
]);
4

2 回答 2

14

添加clicktouchstart事件 -event.preventDefault()将取消事件发生两次:

elem.bind('touchstart click', function (event) {

我在一个应用程序中使用的快速快速点击代码是:

app.directive("ngMobileClick", [function () {
    return function (scope, elem, attrs) {
        elem.bind("touchstart click", function (e) {
            e.preventDefault();
            e.stopPropagation();

            scope.$apply(attrs["ngMobileClick"]);
        });
    }
}])

并使用如下:ng-mobile-click="myScopeFunction()"

于 2014-07-14T20:21:52.840 回答
1

tymeJV 的答案是正确的,但是当我尝试覆盖 ngClick 指令时,该行为与 ngTouch 模块冲突 - 一些点击开始触发两次。原因很简单,ngTouch 关心这些东西但不幸的是有一个错误。

在 touchstart 事件处理程序中,而不是:

  var touches = event.touches && event.touches.length ? event.touches : [event];

它应该有这样的东西:

var touches = null;
  if (event.touches && event.touches.length) {
      //AC: this is original library case
      touches = event.touches;
  } else if (event.originalEvent && event.originalEvent.touches && event.originalEvent.touches.length) {
      //AC: this is fix actually working
      touches =  event.originalEvent.touches;
  }else{
    touches = [event];
  }

ie 事件的 touches 字段由于某种原因未定义,但 event.originalEvent.touches 很好。

在 touchend 中也应该这样做:

var touches = null;
  if (event.changedTouches && event.changedTouches.length) {
      //AC: this is original library case
      touches = event.changedTouches;
  } else if (event.originalEvent && event.originalEvent.changedTouches && event.originalEvent.changedTouches.length) {
      //AC: this is fix actually working
      touches = event.originalEvent.changedTouches;
  } else {
      touches = [event];
  }

ngTouch 的版本是 1.2.27。

于 2014-12-31T14:25:36.510 回答