3131} ) ( function ( $ ) {
3232"use strict" ;
3333
34- var pointerHandled = false ;
35- $ ( document ) . on ( "pointerup pointercancel" , function ( ) {
36- pointerHandled = false ;
37- } ) ;
3834
3935return $ . widget ( "ui.pointer" , {
4036 version : "@VERSION" ,
@@ -43,6 +39,7 @@ return $.widget( "ui.pointer", {
4339 distance : 1 ,
4440 delay : 0
4541 } ,
42+
4643 _pointerInit : function ( ) {
4744 var that = this ;
4845
@@ -76,11 +73,11 @@ return $.widget( "ui.pointer", {
7673 }
7774
7875 this . _pointerStarted = false ;
79- pointerHandled = false ;
8076 } ,
8177
8278 _pointerDown : function ( event ) {
83- if ( pointerHandled ) {
79+ // Ignore any pointer that isn't the primary one (e.g. extra fingers).
80+ if ( ! event . isPrimary ) {
8481 return ;
8582 }
8683
@@ -139,14 +136,17 @@ return $.widget( "ui.pointer", {
139136 . on ( "pointercancel." + this . widgetName , this . _pointerCancelDelegate ) ;
140137
141138 event . preventDefault ( ) ;
142-
143- pointerHandled = true ;
144139 return true ;
145140 } ,
146141
147142 _pointerMove : function ( event ) {
143+ // Document-level listeners fire for all pointers; ignore non-primary ones.
144+ if ( ! event . isPrimary ) {
145+ return ;
146+ }
147+
148148 if ( this . _pointerMoved && event . buttons === 0 ) {
149- return this . _pointerUp ( event ) ;
149+ return this . _pointerUp ( event ) ;
150150 }
151151
152152 if ( event . buttons || event . button ) {
@@ -173,6 +173,11 @@ return $.widget( "ui.pointer", {
173173 } ,
174174
175175 _pointerUp : function ( event ) {
176+ // Document-level listeners fire for all pointers; ignore non-primary ones.
177+ if ( ! event . isPrimary ) {
178+ return ;
179+ }
180+
176181 this . document
177182 . off ( "pointermove." + this . widgetName , this . _pointerMoveDelegate )
178183 . off ( "pointerup." + this . widgetName , this . _pointerUpDelegate )
@@ -193,15 +198,15 @@ return $.widget( "ui.pointer", {
193198 delete this . _pointerDelayTimer ;
194199 }
195200
196- pointerHandled = false ;
197201 event . preventDefault ( ) ;
198202 } ,
199203
200- // pointercancel fires when the browser takes over pointer control (e.g. scroll
201- // gesture, orientation change, stylus palm rejection). Unlike pointerup, it is
202- // not cancelable, so we skip preventDefault() and click-prevention data, but we
203- // still need to tear down all listeners and stop any active drag.
204204 _handlePointerCancel : function ( event ) {
205+ // Document-level listeners fire for all pointers; ignore non-primary ones.
206+ if ( ! event . isPrimary ) {
207+ return ;
208+ }
209+
205210 this . document
206211 . off ( "pointermove." + this . widgetName , this . _pointerMoveDelegate )
207212 . off ( "pointerup." + this . widgetName , this . _pointerUpDelegate )
@@ -216,8 +221,6 @@ return $.widget( "ui.pointer", {
216221 clearTimeout ( this . _pointerDelayTimer ) ;
217222 delete this . _pointerDelayTimer ;
218223 }
219-
220- pointerHandled = false ;
221224 } ,
222225
223226 _pointerDistanceMet : function ( event ) {
0 commit comments