diff --git a/src/edit/mouse_events.js b/src/edit/mouse_events.js
index 0b96f4cfdab00af78a0d7653f8d96a6729c0c5be..10195b575b2fb9a3ff4dc220be577f885fd28618 100644
--- a/src/edit/mouse_events.js
+++ b/src/edit/mouse_events.js
@@ -89,15 +89,16 @@ function leftButtonDown(cm, e, start) {
 // Start a text drag. When it ends, see if any dragging actually
 // happen, and treat as a click if it didn't.
 function leftButtonStartDrag(cm, e, start, modifier) {
-  let display = cm.display, startTime = +new Date
-  let dragEnd = operation(cm, e2 => {
+  let display = cm.display, moved = false
+  let dragEnd = operation(cm, e => {
     if (webkit) display.scroller.draggable = false
     cm.state.draggingText = false
     off(document, "mouseup", dragEnd)
+    off(document, "mousemove", mouseMove)
     off(display.scroller, "drop", dragEnd)
-    if (Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) < 10) {
-      e_preventDefault(e2)
-      if (!modifier && +new Date - 200 < startTime)
+    if (!moved) {
+      e_preventDefault(e)
+      if (!modifier)
         extendSelection(cm.doc, start)
       // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)
       if (webkit || ie && ie_version == 9)
@@ -106,6 +107,9 @@ function leftButtonStartDrag(cm, e, start, modifier) {
         display.input.focus()
     }
   })
+  let mouseMove = function(e2) {
+    moved = moved || Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) >= 10
+  }
   // Let the drag handler handle this.
   if (webkit) display.scroller.draggable = true
   cm.state.draggingText = dragEnd
@@ -113,6 +117,7 @@ function leftButtonStartDrag(cm, e, start, modifier) {
   // IE's approach to draggable
   if (display.scroller.dragDrop) display.scroller.dragDrop()
   on(document, "mouseup", dragEnd)
+  on(document, "mousemove", mouseMove)
   on(display.scroller, "drop", dragEnd)
 }