99
1010'use strict' ;
1111
12+ var mouseOffset = require ( 'mouse-event-offset' ) ;
13+ var hasHover = require ( 'has-hover' ) ;
14+
1215var Plotly = require ( '../../plotly' ) ;
1316var Lib = require ( '../../lib' ) ;
1417
@@ -61,18 +64,25 @@ dragElement.init = function init(options) {
6164 startX ,
6265 startY ,
6366 newMouseDownTime ,
67+ cursor ,
6468 dragCover ,
6569 initialTarget ;
6670
6771 if ( ! gd . _mouseDownTime ) gd . _mouseDownTime = 0 ;
6872
73+ options . element . style . pointerEvents = 'all' ;
74+
75+ options . element . onmousedown = onStart ;
76+ options . element . ontouchstart = onStart ;
77+
6978 function onStart ( e ) {
7079 // make dragging and dragged into properties of gd
7180 // so that others can look at and modify them
7281 gd . _dragged = false ;
7382 gd . _dragging = true ;
74- startX = e . clientX ;
75- startY = e . clientY ;
83+ var offset = pointerOffset ( e ) ;
84+ startX = offset [ 0 ] ;
85+ startY = offset [ 1 ] ;
7686 initialTarget = e . target ;
7787
7888 newMouseDownTime = ( new Date ( ) ) . getTime ( ) ;
@@ -88,20 +98,30 @@ dragElement.init = function init(options) {
8898
8999 if ( options . prepFn ) options . prepFn ( e , startX , startY ) ;
90100
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+ }
96111
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 ) ;
98117
99118 return Lib . pauseEvent ( e ) ;
100119 }
101120
102121 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 ,
105125 minDrag = options . minDrag || constants . MINDRAG ;
106126
107127 if ( Math . abs ( dx ) < minDrag ) dx = 0 ;
@@ -117,10 +137,19 @@ dragElement.init = function init(options) {
117137 }
118138
119139 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+ }
124153
125154 if ( ! gd . _dragging ) {
126155 gd . _dragged = false ;
@@ -143,12 +172,13 @@ dragElement.init = function init(options) {
143172 e2 = new MouseEvent ( 'click' , e ) ;
144173 }
145174 catch ( err ) {
175+ var offset = pointerOffset ( e ) ;
146176 e2 = document . createEvent ( 'MouseEvents' ) ;
147177 e2 . initMouseEvent ( 'click' ,
148178 e . bubbles , e . cancelable ,
149179 e . view , e . detail ,
150180 e . screenX , e . screenY ,
151- e . clientX , e . clientY ,
181+ offset [ 0 ] , offset [ 1 ] ,
152182 e . ctrlKey , e . altKey , e . shiftKey , e . metaKey ,
153183 e . button , e . relatedTarget ) ;
154184 }
@@ -162,9 +192,6 @@ dragElement.init = function init(options) {
162192
163193 return Lib . pauseEvent ( e ) ;
164194 }
165-
166- options . element . onmousedown = onStart ;
167- options . element . style . pointerEvents = 'all' ;
168195} ;
169196
170197function coverSlip ( ) {
@@ -191,3 +218,10 @@ function finishDrag(gd) {
191218 gd . _dragging = false ;
192219 if ( gd . _replotPending ) Plotly . plot ( gd ) ;
193220}
221+
222+ function pointerOffset ( e ) {
223+ return mouseOffset (
224+ e . changedTouches ? e . changedTouches [ 0 ] : e ,
225+ document . body
226+ ) ;
227+ }
0 commit comments