9
9
10
10
'use strict' ;
11
11
12
+ var mouseOffset = require ( 'mouse-event-offset' ) ;
13
+ var hasHover = require ( 'has-hover' ) ;
14
+
12
15
var Plotly = require ( '../../plotly' ) ;
13
16
var Lib = require ( '../../lib' ) ;
14
17
@@ -61,18 +64,25 @@ dragElement.init = function init(options) {
61
64
startX ,
62
65
startY ,
63
66
newMouseDownTime ,
67
+ cursor ,
64
68
dragCover ,
65
69
initialTarget ;
66
70
67
71
if ( ! gd . _mouseDownTime ) gd . _mouseDownTime = 0 ;
68
72
73
+ options . element . style . pointerEvents = 'all' ;
74
+
75
+ options . element . onmousedown = onStart ;
76
+ options . element . ontouchstart = onStart ;
77
+
69
78
function onStart ( e ) {
70
79
// make dragging and dragged into properties of gd
71
80
// so that others can look at and modify them
72
81
gd . _dragged = false ;
73
82
gd . _dragging = true ;
74
- startX = e . clientX ;
75
- startY = e . clientY ;
83
+ var offset = pointerOffset ( e ) ;
84
+ startX = offset [ 0 ] ;
85
+ startY = offset [ 1 ] ;
76
86
initialTarget = e . target ;
77
87
78
88
newMouseDownTime = ( new Date ( ) ) . getTime ( ) ;
@@ -88,20 +98,30 @@ dragElement.init = function init(options) {
88
98
89
99
if ( options . prepFn ) options . prepFn ( e , startX , startY ) ;
90
100
91
- dragCover = coverSlip ( ) ;
92
-
93
- dragCover . onmousemove = onMove ;
94
- dragCover . onmouseup = onDone ;
95
- dragCover . onmouseout = onDone ;
101
+ if ( hasHover ) {
102
+ dragCover = coverSlip ( ) ;
103
+ dragCover . style . cursor = window . getComputedStyle ( options . element ) . cursor ;
104
+ }
105
+ else {
106
+ // document acts as a dragcover for mobile, bc we can't create dragcover dynamically
107
+ dragCover = document ;
108
+ cursor = window . getComputedStyle ( document . documentElement ) . cursor ;
109
+ document . documentElement . style . cursor = window . getComputedStyle ( options . element ) . cursor ;
110
+ }
96
111
97
- dragCover . style . cursor = window . getComputedStyle ( options . element ) . cursor ;
112
+ dragCover . addEventListener ( 'mousemove' , onMove ) ;
113
+ dragCover . addEventListener ( 'mouseup' , onDone ) ;
114
+ dragCover . addEventListener ( 'mouseout' , onDone ) ;
115
+ dragCover . addEventListener ( 'touchmove' , onMove ) ;
116
+ dragCover . addEventListener ( 'touchend' , onDone ) ;
98
117
99
118
return Lib . pauseEvent ( e ) ;
100
119
}
101
120
102
121
function onMove ( e ) {
103
- var dx = e . clientX - startX ,
104
- dy = e . clientY - startY ,
122
+ var offset = pointerOffset ( e ) ,
123
+ dx = offset [ 0 ] - startX ,
124
+ dy = offset [ 1 ] - startY ,
105
125
minDrag = options . minDrag || constants . MINDRAG ;
106
126
107
127
if ( Math . abs ( dx ) < minDrag ) dx = 0 ;
@@ -117,10 +137,19 @@ dragElement.init = function init(options) {
117
137
}
118
138
119
139
function onDone ( e ) {
120
- dragCover . onmousemove = null ;
121
- dragCover . onmouseup = null ;
122
- dragCover . onmouseout = null ;
123
- Lib . removeElement ( dragCover ) ;
140
+ dragCover . removeEventListener ( 'mousemove' , onMove ) ;
141
+ dragCover . removeEventListener ( 'mouseup' , onDone ) ;
142
+ dragCover . removeEventListener ( 'mouseout' , onDone ) ;
143
+ dragCover . removeEventListener ( 'touchmove' , onMove ) ;
144
+ dragCover . removeEventListener ( 'touchend' , onDone ) ;
145
+
146
+ if ( hasHover ) {
147
+ Lib . removeElement ( dragCover ) ;
148
+ }
149
+ else if ( cursor ) {
150
+ dragCover . documentElement . style . cursor = cursor ;
151
+ cursor = null ;
152
+ }
124
153
125
154
if ( ! gd . _dragging ) {
126
155
gd . _dragged = false ;
@@ -143,12 +172,13 @@ dragElement.init = function init(options) {
143
172
e2 = new MouseEvent ( 'click' , e ) ;
144
173
}
145
174
catch ( err ) {
175
+ var offset = pointerOffset ( e ) ;
146
176
e2 = document . createEvent ( 'MouseEvents' ) ;
147
177
e2 . initMouseEvent ( 'click' ,
148
178
e . bubbles , e . cancelable ,
149
179
e . view , e . detail ,
150
180
e . screenX , e . screenY ,
151
- e . clientX , e . clientY ,
181
+ offset [ 0 ] , offset [ 1 ] ,
152
182
e . ctrlKey , e . altKey , e . shiftKey , e . metaKey ,
153
183
e . button , e . relatedTarget ) ;
154
184
}
@@ -162,9 +192,6 @@ dragElement.init = function init(options) {
162
192
163
193
return Lib . pauseEvent ( e ) ;
164
194
}
165
-
166
- options . element . onmousedown = onStart ;
167
- options . element . style . pointerEvents = 'all' ;
168
195
} ;
169
196
170
197
function coverSlip ( ) {
@@ -191,3 +218,10 @@ function finishDrag(gd) {
191
218
gd . _dragging = false ;
192
219
if ( gd . _replotPending ) Plotly . plot ( gd ) ;
193
220
}
221
+
222
+ function pointerOffset ( e ) {
223
+ return mouseOffset (
224
+ e . changedTouches ? e . changedTouches [ 0 ] : e ,
225
+ document . body
226
+ ) ;
227
+ }
0 commit comments