Skip to content

Commit d84f283

Browse files
Create pointer.js
A quick port of mouse.js to pointer events
1 parent 13bbc77 commit d84f283

File tree

1 file changed

+209
-0
lines changed

1 file changed

+209
-0
lines changed

ui/widgets/pointer.js

Lines changed: 209 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,209 @@
1+
/*!
2+
* jQuery UI Pointer @VERSION
3+
* https://jqueryui.com
4+
*
5+
* Copyright OpenJS Foundation and other contributors
6+
* Released under the MIT license.
7+
* https://jquery.org/license
8+
*/
9+
10+
//>>label: Pointer
11+
//>>group: Widgets
12+
//>>description: Abstracts pointer-based interactions to assist in creating certain widgets.
13+
//>>docs: https://api.jqueryui.com/pointer/
14+
15+
( function( factory ) {
16+
"use strict";
17+
18+
if ( typeof define === "function" && define.amd ) {
19+
20+
// AMD. Register as an anonymous module.
21+
define( [
22+
"jquery",
23+
"../version",
24+
"../widget"
25+
], factory );
26+
} else {
27+
28+
// Browser globals
29+
factory( jQuery );
30+
}
31+
} )( function( $ ) {
32+
"use strict";
33+
34+
var pointerHandled = false;
35+
$( document ).on( "pointerup", function() {
36+
pointerHandled = false;
37+
} );
38+
39+
return $.widget( "ui.mouse", {
40+
version: "@VERSION",
41+
options: {
42+
cancel: "input, textarea, button, select, option",
43+
distance: 1,
44+
delay: 0
45+
},
46+
_pointerInit: function() {
47+
var that = this;
48+
49+
this.element
50+
.on( "pointerdown." + this.widgetName, function( event ) {
51+
return that._pointerDown( event );
52+
} )
53+
.on( "click." + this.widgetName, function( event ) {
54+
if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) {
55+
$.removeData( event.target, that.widgetName + ".preventClickEvent" );
56+
event.stopImmediatePropagation();
57+
return false;
58+
}
59+
} );
60+
61+
this.started = false;
62+
},
63+
64+
_pointerDestroy: function() {
65+
this.element.off( "." + this.widgetName );
66+
if ( this._pointerMoveDelegate ) {
67+
this.document
68+
.off( "pointermove." + this.widgetName, this._pointerMoveDelegate )
69+
.off( "pointerup." + this.widgetName, this._pointerUpDelegate );
70+
}
71+
},
72+
73+
_pointerDown: function( event ) {
74+
if ( pointerHandled ) {
75+
return;
76+
}
77+
78+
this._pointerMoved = false;
79+
80+
if ( this._pointerStarted ) {
81+
this._pointerUp( event );
82+
}
83+
84+
this._pointerDownEvent = event;
85+
86+
var that = this,
87+
btnIsLeft = event.button === 0,
88+
elIsCancel = typeof this.options.cancel === "string" ?
89+
$( event.target ).closest( this.options.cancel ).length :
90+
false;
91+
if ( !btnIsLeft || elIsCancel || !this._pointerCapture( event ) ) {
92+
return true;
93+
}
94+
95+
this.pointerDelayMet = !this.options.delay;
96+
if ( !this.pointerDelayMet ) {
97+
this._pointerDelayTimer = setTimeout( function() {
98+
that.pointerDelayMet = true;
99+
}, this.options.delay );
100+
}
101+
102+
if ( this._pointerDistanceMet( event ) && this._pointerDelayMet( event ) ) {
103+
this._pointerStarted = ( this._pointerStart( event ) !== false );
104+
if ( !this._pointerStarted ) {
105+
event.preventDefault();
106+
return true;
107+
}
108+
}
109+
110+
if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) {
111+
$.removeData( event.target, this.widgetName + ".preventClickEvent" );
112+
}
113+
114+
this._pointerMoveDelegate = function( event ) {
115+
return that._pointerMove( event );
116+
};
117+
this._pointerUpDelegate = function( event ) {
118+
return that._pointerUp( event );
119+
};
120+
121+
this.document
122+
.on( "pointermove." + this.widgetName, this._pointerMoveDelegate )
123+
.on( "pointerup." + this.widgetName, this._pointerUpDelegate );
124+
125+
event.preventDefault();
126+
127+
pointerHandled = true;
128+
return true;
129+
},
130+
131+
_pointerMove: function( event ) {
132+
if ( this._pointerMoved && event.buttons === 0 ) {
133+
if ( event.altKey || event.ctrlKey ||
134+
event.metaKey || event.shiftKey ) {
135+
this.ignoreMissingButtons = true;
136+
} else if ( !this.ignoreMissingButtons ) {
137+
return this._pointerUp( event );
138+
}
139+
}
140+
141+
if ( event.buttons || event.button ) {
142+
this._pointerMoved = true;
143+
}
144+
145+
if ( this._pointerStarted ) {
146+
this._pointerDrag( event );
147+
return event.preventDefault();
148+
}
149+
150+
if ( this._pointerDistanceMet( event ) && this._pointerDelayMet( event ) ) {
151+
this._pointerStarted =
152+
( this._pointerStart( this._pointerDownEvent, event ) !== false );
153+
if ( this._pointerStarted ) {
154+
this._pointerDrag( event );
155+
} else {
156+
this._pointerUp( event );
157+
}
158+
}
159+
160+
return !this._pointerStarted;
161+
},
162+
163+
_pointerUp: function( event ) {
164+
this.document
165+
.off( "pointermove." + this.widgetName, this._pointerMoveDelegate )
166+
.off( "pointerup." + this.widgetName, this._pointerUpDelegate );
167+
168+
if ( this._pointerStarted ) {
169+
this._pointerStarted = false;
170+
171+
if ( event.target === this._pointerDownEvent.target ) {
172+
$.data( event.target, this.widgetName + ".preventClickEvent", true );
173+
}
174+
175+
this._pointerStop( event );
176+
}
177+
178+
if ( this._pointerDelayTimer ) {
179+
clearTimeout( this._pointerDelayTimer );
180+
delete this._pointerDelayTimer;
181+
}
182+
183+
this.ignoreMissingButtons = false;
184+
pointerHandled = false;
185+
event.preventDefault();
186+
},
187+
188+
_pointerDistanceMet: function( event ) {
189+
return ( Math.max(
190+
Math.abs( this._pointerDownEvent.pageX - event.pageX ),
191+
Math.abs( this._pointerDownEvent.pageY - event.pageY )
192+
) >= this.options.distance
193+
);
194+
},
195+
196+
_pointerDelayMet: function( /* event */ ) {
197+
return this.pointerDelayMet;
198+
},
199+
200+
// These are placeholder methods, to be overriden by extending plugin
201+
_pointerStart: function( /* event */ ) {},
202+
_pointerDrag: function( /* event */ ) {},
203+
_pointerStop: function( /* event */ ) {},
204+
_pointerCapture: function( /* event */ ) {
205+
return true;
206+
}
207+
} );
208+
209+
} );

0 commit comments

Comments
 (0)