2014-07-14 2 views
5

각도 터치 ngTouch 터치 릴리즈에서 클릭이 발생합니다.AngularJS TouchStart를 클릭하십시오.

터치 시작시 클릭을 발생시키는 방법이 있습니까?

아래의 지시문은 터치 스크린에서 원하는 것을 수행하는 것으로 보이지만 마우스 클릭에는 작동하지 않습니다.

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 }); }); 
     }); 
    }; 
    } 
]); 

답변

14

touchstart 이벤트에 click 추가 - event.preventDefault() 두 번 일어나는 이벤트를 취소됩니다

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

나는 하나의 응용 프로그램에서 사용하는 빠른 fastclick 코드는 다음과 같습니다

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()"

+0

@benshope - 제가 지원하는 앱에서 사용하는 fastclick/touchstart 코드를 게시했습니다. 작업을 완료해야합니다. – tymeJV

+0

그것이 작동하는 것, 감사합니다! – benshope

+0

범위가 아니어야합니까? $ apply (attrs [ "ng-mobile-click"]); 또는 잘못 되었습니까? – jstudios

1

tymeJV의 대답은 정확하지만 ngClick 지시문을 덮어 쓰려고 시도하면 ngTouch 모듈과 충돌이 발생합니다. 일부 클릭은 두 번 시작됩니다. 그 이유는 간단합니다. ngTouch는 그 일에 관심이 있지만 불행히도 버그가 있습니다.

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

가 이런 식으로 뭔가가 있어야합니다 : touchstart 이벤트 핸들러 대신에

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]; 
    } 

이벤트의 접촉 필드는 어떤 이유로 정의되지 않은,하지만 event.originalEvent.touches 잘입니다 즉, .

마찬가지 touchend에서 수행해야합니다 ngTouch의

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]; 
    } 

버전은 1.2.27입니다.

관련 문제