Skip to content

Commit 59a9d46

Browse files
committed
Pointer: Add pointerover and pointerout, fix pointercancel, trigger pointerover and pointerout when hover is not supported, add missing properties and properly translate MSPointer pointerType integers to Pointer strings
1 parent 37ad84b commit 59a9d46

File tree

1 file changed

+75
-24
lines changed

1 file changed

+75
-24
lines changed

external/pointer.js

Lines changed: 75 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
var POINTER_TYPE_UNAVAILABLE = "",
33
POINTER_TYPE_TOUCH = "touch",
44
POINTER_TYPE_PEN = "pen",
5-
POINTER_TYPE_MOUSE = "mouse";
5+
POINTER_TYPE_MOUSE = "mouse",
6+
preventDuplicate = false;
67

78
function processEvent( event, pointerType ) {
8-
var propLength,
9+
var propLength, touch,
910
i = 0,
1011
orig = event,
1112
mouseProps = $.event.mouseHooks.props;
@@ -32,7 +33,14 @@ function processEvent( event, pointerType ) {
3233
event.pointerType = POINTER_TYPE_MOUSE;
3334
event.isPrimary = true;
3435
} else if ( orig.type.indexOf("touch") !== -1 ) {
35-
event.pointerId = orig.pointerId;
36+
touch = orig.originalEvent.changedTouches[ 0 ];
37+
event.pageX = touch.pageX;
38+
event.pageY = touch.pageY;
39+
event.screenX = touch.screenX;
40+
event.screenY = touch.screenY;
41+
event.clientX = touch.clientX;
42+
event.clientY = touch.clientY;
43+
event.pointerId = touch.identifier;
3644
event.pointerType = POINTER_TYPE_TOUCH;
3745
event.button = 0;
3846
event.buttons = 1;
@@ -41,35 +49,42 @@ function processEvent( event, pointerType ) {
4149
event.isPrimary = true;
4250
} else if ( orig.type.indexOf("Pointer") !== -1 ) {
4351
event.pointerId = orig.originalEvent.pointerId;
44-
event.pointerType = orig.originalEvent.pointerType || POINTER_TYPE_UNAVAILABLE;
52+
event.pointerType = processMSPointerType( orig.originalEvent.pointerType );
4553
event.button = orig.originalEvent.button;
46-
event.buttons = orig.originalEvent.buttons;
54+
event.buttons = event.pointerType === "touch" ? 1 : orig.originalEvent.buttons;
4755
event.width = orig.originalEvent.width;
4856
event.height = orig.originalEvent.height;
4957
event.pressure = orig.originalEvent.pressure;
5058
event.tiltX = orig.originalEvent.tiltX;
5159
event.tiltY = orig.originalEvent.tiltY;
60+
event.pageX = orig.originalEvent.pageX;
61+
event.pageY = orig.originalEvent.pageY;
62+
event.screenX = orig.originalEvent.screenX;
63+
event.screenY = orig.originalEvent.screenY;
64+
event.clientX = orig.originalEvent.clientX;
65+
event.clientY = orig.originalEvent.clientY;
5266
event.isPrimary = orig.originalEvent.isPrimary;
5367
}
5468

5569
return event;
5670
}
5771

58-
function pointerEventHandler( event, type ) {
59-
var touch;
60-
61-
if ( event.type.indexOf("touch") !== -1 ) {
62-
touch = event.originalEvent.changedTouches[ 0 ];
63-
event.pageX = touch.pageX;
64-
event.pageY = touch.pageY;
65-
event.screenX = touch.screenX;
66-
event.screenY = touch.screenY;
67-
event.clientX = touch.clientX;
68-
event.clientY = touch.clientY;
69-
event.pointerId = touch.identifier;
72+
function checkHoverSupport( event, toTrigger ) {
73+
if ( event.type.indexOf("touch") !== -1 || event.originalEvent.pointerType === 2 ) {
74+
$( event.target ).trigger( processEvent( event, toTrigger ) );
7075
}
76+
}
7177

72-
$( event.target ).trigger( processEvent( event, type ) );
78+
function processMSPointerType( type ) {
79+
if ( type === 2 ) {
80+
return POINTER_TYPE_TOUCH;
81+
} else if ( type === 3 ) {
82+
return POINTER_TYPE_PEN;
83+
} else if ( type === 4 ) {
84+
return POINTER_TYPE_MOUSE;
85+
} else {
86+
return POINTER_TYPE_UNAVAILABLE;
87+
}
7388
}
7489

7590
$.event.special.pointerdown = {
@@ -80,7 +95,17 @@ $.event.special.pointerdown = {
8095
$( this ).off( "mousedown touchstart MSPointerDown", $.event.special.pointerdown.handler );
8196
},
8297
handler: function( event ) {
83-
pointerEventHandler( event, "pointerdown" );
98+
if ( !preventDuplicate ) {
99+
// Trigger pointerover for devices that don't support hover
100+
checkHoverSupport( event, "pointerover" );
101+
$( event.target ).trigger( processEvent( event, "pointerdown" ) );
102+
}
103+
104+
if ( event.type.indexOf("Pointer") !== -1 ) {
105+
preventDuplicate = true;
106+
} else {
107+
preventDuplicate = false;
108+
}
84109
}
85110
};
86111

@@ -92,7 +117,8 @@ $.event.special.pointerup = {
92117
$( this ).off( "mouseup touchend MSPointerUp", $.event.special.pointerup.handler );
93118
},
94119
handler: function( event ) {
95-
pointerEventHandler( event, "pointerup" );
120+
checkHoverSupport( event, "pointerout" );
121+
$( event.target ).trigger( processEvent( event, "pointerup" ) );
96122
}
97123
};
98124

@@ -104,19 +130,44 @@ $.event.special.pointermove = {
104130
$( this ).off( "mousemove touchmove MSPointerMove", $.event.special.pointermove.handler );
105131
},
106132
handler: function( event ) {
107-
pointerEventHandler( event, "pointermove" );
133+
$( event.target ).trigger( processEvent( event, "pointermove" ) );
108134
}
109135
};
110136

111137
$.event.special.pointercancel = {
112138
setup: function() {
113-
$( this ).on( "touchcancel MSPointerCancel", $.event.special.pointermove.handler );
139+
$( this ).on( "touchcancel MSPointerCancel", $.event.special.pointercancel.handler );
140+
},
141+
teardown: function() {
142+
$( this ).off( "touchcancel MSPointerCancel", $.event.special.pointercancel.handler );
143+
},
144+
handler: function( event ) {
145+
$( event.target ).trigger( processEvent( event, "pointercancel" ) );
146+
$( event.target ).trigger( processEvent( event, "pointerout" ) );
147+
}
148+
};
149+
150+
$.event.special.pointerover = {
151+
setup: function() {
152+
$( this ).on( "mouseover MSPointerOver", $.event.special.pointerover.handler );
153+
},
154+
teardown: function() {
155+
$( this ).off( "mouseover MSPointerOver", $.event.special.pointerover.handler );
156+
},
157+
handler: function( event ) {
158+
$( event.target ).trigger( processEvent( event, "pointerover" ) );
159+
}
160+
};
161+
162+
$.event.special.pointerout = {
163+
setup: function() {
164+
$( this ).on( "mouseout MSPointerOut", $.event.special.pointerout.handler );
114165
},
115166
teardown: function() {
116-
$( this ).off( "touchcancel MSPointerCancel", $.event.special.pointermove.handler );
167+
$( this ).off( "mouseout MSPointerOut", $.event.special.pointerout.handler );
117168
},
118169
handler: function( event ) {
119-
pointerEventHandler( event, "pointercancel" );
170+
$( event.target ).trigger( processEvent( event, "pointerout" ) );
120171
}
121172
};
122173
})( jQuery );

0 commit comments

Comments
 (0)