3232"use strict" ;
3333
3434var pointerHandled = false ;
35- $ ( document ) . on ( "pointerup" , function ( ) {
35+ $ ( document ) . on ( "pointerup pointercancel " , function ( ) {
3636 pointerHandled = false ;
3737} ) ;
3838
@@ -66,7 +66,8 @@ return $.widget( "ui.pointer", {
6666 if ( this . _pointerMoveDelegate ) {
6767 this . document
6868 . off ( "pointermove." + this . widgetName , this . _pointerMoveDelegate )
69- . off ( "pointerup." + this . widgetName , this . _pointerUpDelegate ) ;
69+ . off ( "pointerup." + this . widgetName , this . _pointerUpDelegate )
70+ . off ( "pointercancel." + this . widgetName , this . _pointerCancelDelegate ) ;
7071 }
7172 } ,
7273
@@ -117,10 +118,14 @@ return $.widget( "ui.pointer", {
117118 this . _pointerUpDelegate = function ( event ) {
118119 return that . _pointerUp ( event ) ;
119120 } ;
121+ this . _pointerCancelDelegate = function ( event ) {
122+ return that . _pointerCancel ( event ) ;
123+ } ;
120124
121125 this . document
122126 . on ( "pointermove." + this . widgetName , this . _pointerMoveDelegate )
123- . on ( "pointerup." + this . widgetName , this . _pointerUpDelegate ) ;
127+ . on ( "pointerup." + this . widgetName , this . _pointerUpDelegate )
128+ . on ( "pointercancel." + this . widgetName , this . _pointerCancelDelegate ) ;
124129
125130 event . preventDefault ( ) ;
126131
@@ -158,7 +163,8 @@ return $.widget( "ui.pointer", {
158163 _pointerUp : function ( event ) {
159164 this . document
160165 . off ( "pointermove." + this . widgetName , this . _pointerMoveDelegate )
161- . off ( "pointerup." + this . widgetName , this . _pointerUpDelegate ) ;
166+ . off ( "pointerup." + this . widgetName , this . _pointerUpDelegate )
167+ . off ( "pointercancel." + this . widgetName , this . _pointerCancelDelegate ) ;
162168
163169 if ( this . _pointerStarted ) {
164170 this . _pointerStarted = false ;
@@ -179,6 +185,29 @@ return $.widget( "ui.pointer", {
179185 event . preventDefault ( ) ;
180186 } ,
181187
188+ // pointercancel fires when the browser takes over pointer control (e.g. scroll
189+ // gesture, orientation change, stylus palm rejection). Unlike pointerup, it is
190+ // not cancelable, so we skip preventDefault() and click-prevention data, but we
191+ // still need to tear down all listeners and stop any active drag.
192+ _pointerCancel : function ( event ) {
193+ this . document
194+ . off ( "pointermove." + this . widgetName , this . _pointerMoveDelegate )
195+ . off ( "pointerup." + this . widgetName , this . _pointerUpDelegate )
196+ . off ( "pointercancel." + this . widgetName , this . _pointerCancelDelegate ) ;
197+
198+ if ( this . _pointerStarted ) {
199+ this . _pointerStarted = false ;
200+ this . _pointerCancel ( event ) ;
201+ }
202+
203+ if ( this . _pointerDelayTimer ) {
204+ clearTimeout ( this . _pointerDelayTimer ) ;
205+ delete this . _pointerDelayTimer ;
206+ }
207+
208+ pointerHandled = false ;
209+ } ,
210+
182211 _pointerDistanceMet : function ( event ) {
183212 return ( Math . max (
184213 Math . abs ( this . _pointerDownEvent . pageX - event . pageX ) ,
@@ -195,6 +224,10 @@ return $.widget( "ui.pointer", {
195224 _pointerStart : function ( /* event */ ) { } ,
196225 _pointerDrag : function ( /* event */ ) { } ,
197226 _pointerStop : function ( /* event */ ) { } ,
227+ // _pointerStop by default so existing subwidgets need no changes.
228+ _pointerCancel : function ( event ) {
229+ this . _pointerStop ( event ) ;
230+ } ,
198231 _pointerCapture : function ( /* event */ ) {
199232 return true ;
200233 }
0 commit comments