@@ -18,7 +18,7 @@ const startPositions: WeakMap<ImageCropElement, {startX: number; startY: number}
18
18
const dragStartPositions : WeakMap < ImageCropElement , { dragStartX : number ; dragStartY : number } > = new WeakMap ( )
19
19
const constructedElements : WeakMap < ImageCropElement , { image : HTMLImageElement ; box : HTMLElement } > = new WeakMap ( )
20
20
21
- function moveCropArea ( event : MouseEvent | KeyboardEvent ) {
21
+ function moveCropArea ( event : TouchEvent | MouseEvent | KeyboardEvent ) {
22
22
const el = event . currentTarget
23
23
if ( ! ( el instanceof ImageCropElement ) ) return
24
24
const { box, image} = constructedElements . get ( el ) || { }
@@ -37,10 +37,16 @@ function moveCropArea(event: MouseEvent | KeyboardEvent) {
37
37
deltaX = 1
38
38
}
39
39
} else if ( dragStartPositions . has ( el ) && event instanceof MouseEvent ) {
40
- const pos = dragStartPositions . get ( el )
41
- if ( ! pos ) return
40
+ const pos = dragStartPositions . get ( el ) !
42
41
deltaX = event . pageX - pos . dragStartX
43
42
deltaY = event . pageY - pos . dragStartY
43
+ } else if ( dragStartPositions . has ( el ) && event instanceof TouchEvent ) {
44
+ // Only support a single touch at a time
45
+ const { pageX, pageY} = event . changedTouches [ 0 ]
46
+
47
+ const { dragStartX, dragStartY} = dragStartPositions . get ( el ) !
48
+ deltaX = pageX - dragStartX
49
+ deltaY = pageY - dragStartY
44
50
}
45
51
46
52
if ( deltaX !== 0 || deltaY !== 0 ) {
@@ -57,10 +63,17 @@ function moveCropArea(event: MouseEvent | KeyboardEvent) {
57
63
dragStartX : event . pageX ,
58
64
dragStartY : event . pageY
59
65
} )
66
+ } else if ( event instanceof TouchEvent ) {
67
+ // Only support a single touch at a time
68
+ const { pageX, pageY} = event . changedTouches [ 0 ]
69
+ dragStartPositions . set ( el , {
70
+ dragStartX : pageX ,
71
+ dragStartY : pageY
72
+ } )
60
73
}
61
74
}
62
75
63
- function updateCropArea ( event : MouseEvent | KeyboardEvent ) {
76
+ function updateCropArea ( event : TouchEvent | MouseEvent | KeyboardEvent ) {
64
77
const target = event . target
65
78
if ( ! ( target instanceof HTMLElement ) ) return
66
79
@@ -84,12 +97,17 @@ function updateCropArea(event: MouseEvent | KeyboardEvent) {
84
97
if ( ! pos ) return
85
98
deltaX = event . pageX - pos . startX - rect . left - window . pageXOffset
86
99
deltaY = event . pageY - pos . startY - rect . top - window . pageYOffset
100
+ } else if ( event instanceof TouchEvent ) {
101
+ const pos = startPositions . get ( el )
102
+ if ( ! pos ) return
103
+ deltaX = event . changedTouches [ 0 ] . pageX - pos . startX - rect . left - window . pageXOffset
104
+ deltaY = event . changedTouches [ 0 ] . pageY - pos . startY - rect . top - window . pageYOffset
87
105
}
88
106
89
107
if ( deltaX && deltaY ) updateDimensions ( el , deltaX , deltaY , ! ( event instanceof KeyboardEvent ) )
90
108
}
91
109
92
- function startUpdate ( event : MouseEvent ) {
110
+ function startUpdate ( event : TouchEvent | MouseEvent ) {
93
111
const currentTarget = event . currentTarget
94
112
if ( ! ( currentTarget instanceof HTMLElement ) ) return
95
113
@@ -105,6 +123,7 @@ function startUpdate(event: MouseEvent) {
105
123
const direction = target . getAttribute ( 'data-direction' ) || ''
106
124
// Change crop area
107
125
el . addEventListener ( 'mousemove' , updateCropArea )
126
+ el . addEventListener ( 'touchmove' , updateCropArea )
108
127
if ( [ 'nw' , 'se' ] . indexOf ( direction ) >= 0 ) el . classList . add ( 'nwse' )
109
128
if ( [ 'ne' , 'sw' ] . indexOf ( direction ) >= 0 ) el . classList . add ( 'nesw' )
110
129
startPositions . set ( el , {
@@ -115,6 +134,7 @@ function startUpdate(event: MouseEvent) {
115
134
} else {
116
135
// Move crop area
117
136
el . addEventListener ( 'mousemove' , moveCropArea )
137
+ el . addEventListener ( 'touchmove' , moveCropArea )
118
138
}
119
139
}
120
140
@@ -164,14 +184,16 @@ function setInitialPosition(el: ImageCropElement) {
164
184
updateDimensions ( el , side , side )
165
185
}
166
186
167
- function stopUpdate ( event : MouseEvent ) {
187
+ function stopUpdate ( event : TouchEvent | MouseEvent ) {
168
188
const el = event . currentTarget
169
189
if ( ! ( el instanceof ImageCropElement ) ) return
170
190
171
191
dragStartPositions . delete ( el )
172
192
el . classList . remove ( 'nwse' , 'nesw' )
173
193
el . removeEventListener ( 'mousemove' , updateCropArea )
174
194
el . removeEventListener ( 'mousemove' , moveCropArea )
195
+ el . removeEventListener ( 'touchmove' , updateCropArea )
196
+ el . removeEventListener ( 'touchmove' , moveCropArea )
175
197
}
176
198
177
199
interface Result {
@@ -208,8 +230,10 @@ class ImageCropElement extends HTMLElement {
208
230
209
231
image . addEventListener ( 'load' , imageReady )
210
232
this . addEventListener ( 'mouseleave' , stopUpdate )
233
+ this . addEventListener ( 'touchend' , stopUpdate )
211
234
this . addEventListener ( 'mouseup' , stopUpdate )
212
235
box . addEventListener ( 'mousedown' , startUpdate )
236
+ box . addEventListener ( 'touchstart' , startUpdate )
213
237
this . addEventListener ( 'keydown' , moveCropArea )
214
238
this . addEventListener ( 'keydown' , updateCropArea )
215
239
0 commit comments