@@ -71,6 +71,7 @@ export class Gesture extends Disposable {
7171
7272 private dispatched = false ;
7373 private targets : HTMLElement [ ] ;
74+ private ignoreTargets : HTMLElement [ ] ;
7475 private handle : IDisposable | null ;
7576
7677 private activeTouches : { [ id : number ] : TouchData ; } ;
@@ -81,6 +82,7 @@ export class Gesture extends Disposable {
8182 this . activeTouches = { } ;
8283 this . handle = null ;
8384 this . targets = [ ] ;
85+ this . ignoreTargets = [ ] ;
8486 this . _register ( DomUtils . addDisposableListener ( document , 'touchstart' , ( e : TouchEvent ) => this . onTouchStart ( e ) ) ) ;
8587 this . _register ( DomUtils . addDisposableListener ( document , 'touchend' , ( e : TouchEvent ) => this . onTouchEnd ( e ) ) ) ;
8688 this . _register ( DomUtils . addDisposableListener ( document , 'touchmove' , ( e : TouchEvent ) => this . onTouchMove ( e ) ) ) ;
@@ -103,6 +105,23 @@ export class Gesture extends Disposable {
103105 } ;
104106 }
105107
108+ public static ignoreTarget ( element : HTMLElement ) : IDisposable {
109+ if ( ! Gesture . isTouchDevice ( ) ) {
110+ return Disposable . None ;
111+ }
112+ if ( ! Gesture . INSTANCE ) {
113+ Gesture . INSTANCE = new Gesture ( ) ;
114+ }
115+
116+ Gesture . INSTANCE . ignoreTargets . push ( element ) ;
117+
118+ return {
119+ dispose : ( ) => {
120+ Gesture . INSTANCE . ignoreTargets = Gesture . INSTANCE . ignoreTargets . filter ( t => t !== element ) ;
121+ }
122+ } ;
123+ }
124+
106125 @memoize
107126 private static isTouchDevice ( ) : boolean {
108127 return 'ontouchstart' in window as any || navigator . maxTouchPoints > 0 || window . navigator . msMaxTouchPoints > 0 ;
@@ -228,6 +247,12 @@ export class Gesture extends Disposable {
228247 }
229248
230249 private dispatchEvent ( event : GestureEvent ) : void {
250+ for ( let i = 0 ; i < this . ignoreTargets . length ; i ++ ) {
251+ if ( event . initialTarget instanceof Node && this . ignoreTargets [ i ] . contains ( event . initialTarget ) ) {
252+ return ;
253+ }
254+ }
255+
231256 this . targets . forEach ( target => {
232257 if ( event . initialTarget instanceof Node && target . contains ( event . initialTarget ) ) {
233258 target . dispatchEvent ( event ) ;
0 commit comments