2
2
var POINTER_TYPE_UNAVAILABLE = "" ,
3
3
POINTER_TYPE_TOUCH = "touch" ,
4
4
POINTER_TYPE_PEN = "pen" ,
5
- POINTER_TYPE_MOUSE = "mouse" ;
5
+ POINTER_TYPE_MOUSE = "mouse" ,
6
+ preventDuplicate = false ;
6
7
7
8
function processEvent ( event , pointerType ) {
8
- var propLength ,
9
+ var propLength , touch ,
9
10
i = 0 ,
10
11
orig = event ,
11
12
mouseProps = $ . event . mouseHooks . props ;
@@ -32,7 +33,14 @@ function processEvent( event, pointerType ) {
32
33
event . pointerType = POINTER_TYPE_MOUSE ;
33
34
event . isPrimary = true ;
34
35
} 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 ;
36
44
event . pointerType = POINTER_TYPE_TOUCH ;
37
45
event . button = 0 ;
38
46
event . buttons = 1 ;
@@ -41,35 +49,42 @@ function processEvent( event, pointerType ) {
41
49
event . isPrimary = true ;
42
50
} else if ( orig . type . indexOf ( "Pointer" ) !== - 1 ) {
43
51
event . pointerId = orig . originalEvent . pointerId ;
44
- event . pointerType = orig . originalEvent . pointerType || POINTER_TYPE_UNAVAILABLE ;
52
+ event . pointerType = processMSPointerType ( orig . originalEvent . pointerType ) ;
45
53
event . button = orig . originalEvent . button ;
46
- event . buttons = orig . originalEvent . buttons ;
54
+ event . buttons = event . pointerType === "touch" ? 1 : orig . originalEvent . buttons ;
47
55
event . width = orig . originalEvent . width ;
48
56
event . height = orig . originalEvent . height ;
49
57
event . pressure = orig . originalEvent . pressure ;
50
58
event . tiltX = orig . originalEvent . tiltX ;
51
59
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 ;
52
66
event . isPrimary = orig . originalEvent . isPrimary ;
53
67
}
54
68
55
69
return event ;
56
70
}
57
71
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 ) ) ;
70
75
}
76
+ }
71
77
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
+ }
73
88
}
74
89
75
90
$ . event . special . pointerdown = {
@@ -80,7 +95,17 @@ $.event.special.pointerdown = {
80
95
$ ( this ) . off ( "mousedown touchstart MSPointerDown" , $ . event . special . pointerdown . handler ) ;
81
96
} ,
82
97
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
+ }
84
109
}
85
110
} ;
86
111
@@ -92,7 +117,8 @@ $.event.special.pointerup = {
92
117
$ ( this ) . off ( "mouseup touchend MSPointerUp" , $ . event . special . pointerup . handler ) ;
93
118
} ,
94
119
handler : function ( event ) {
95
- pointerEventHandler ( event , "pointerup" ) ;
120
+ checkHoverSupport ( event , "pointerout" ) ;
121
+ $ ( event . target ) . trigger ( processEvent ( event , "pointerup" ) ) ;
96
122
}
97
123
} ;
98
124
@@ -104,19 +130,44 @@ $.event.special.pointermove = {
104
130
$ ( this ) . off ( "mousemove touchmove MSPointerMove" , $ . event . special . pointermove . handler ) ;
105
131
} ,
106
132
handler : function ( event ) {
107
- pointerEventHandler ( event , "pointermove" ) ;
133
+ $ ( event . target ) . trigger ( processEvent ( event , "pointermove" ) ) ;
108
134
}
109
135
} ;
110
136
111
137
$ . event . special . pointercancel = {
112
138
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 ) ;
114
165
} ,
115
166
teardown : function ( ) {
116
- $ ( this ) . off ( "touchcancel MSPointerCancel " , $ . event . special . pointermove . handler ) ;
167
+ $ ( this ) . off ( "mouseout MSPointerOut " , $ . event . special . pointerout . handler ) ;
117
168
} ,
118
169
handler : function ( event ) {
119
- pointerEventHandler ( event , "pointercancel" ) ;
170
+ $ ( event . target ) . trigger ( processEvent ( event , "pointerout" ) ) ;
120
171
}
121
172
} ;
122
173
} ) ( jQuery ) ;
0 commit comments