Ho provato ad implementare una pagina panoramica trascinando. Nella mia implementazione la pagina si sposta per un po 'dopo che l'utente ha rilasciato il pulsante del mouse, come trascinare le mappe in Google Maps. Ora mi piacerebbe evitare questo effetto, quando il mouse non si muove più quando l'utente rilascia il pulsante. Il problema è che non riesco a capire come rilevare se il mouse si muove davvero quando viene attivato l'evento mouseup
.Come rilevare se il mouse si muove quando viene lanciato mouseup?
Per ora ho provato ad affrontare questo problema calcolando la velocità di trascinamento e quindi confrontare la velocità con una "sensibilità" pre-valutata, che funziona la maggior parte del tempo, ma a volte fallisce.
Esempio semplificato a jsFiddle. Quando si suona con il violino, si prega di utilizzare il tasto centrale in FF, il div draggabble "si attacca" al pulsante sinistro.
Pseudocodice:
AniMove = function (doc, element, sensitivity, panspeed, duration) {
var mouseDown = function (e) {
sTime = new Date();
originalX = mouseX = e.clientX;
originalY = mouseY = e.clientY;
/* addEventListeners mousemove & mouseup for document */
return;
},
mouseMove = function (e) {
/* Setting new position for #square + new mouseX & Y */
return;
},
mouseUp = function() {
var dc = 1;
/* removeEventListeners mousemove & mouseup */
eTime = new Date();
vX = Math.round((50 * panspeed) * (originalX - mouseX)/(eTime - sTime));
vY = Math.round((50 * panspeed) * (originalY - mouseY)/(eTime - sTime));
// Check whether mouse is moving or not,
// now checking the speed against sensitivity, which is not reliable
if (Math.abs(vX) < sensitivity){vX = 0;}
if (Math.abs(vY) < sensitivity){vY = 0;}
for (n = 0; n < dur; n++, dc += 0.001) {
vX = Math.round(vX * dec/dc);
vY = Math.round(vY * dec/dc);
delay[n] = setTimeout(endDrag(n, vX, vY), n * 50);
}
return;
},
endDrag = function (n, vX, vY) {
/* Setting new position for #square */
return;
},
dec = 1 - 120/duration;
panspeed *= -0.01;
duration /= 50;
element.addEventListener('mousedown', mouseDown, false);
}
drag = new AniMove(document, document.getElementById('square'), 20, 100, 500);
Quindi, è anche possibile rilevare se il mouse è in movimento o non in questa situazione? Forse ho bisogno di un approccio diverso per questo compito?
Grazie, ora funziona! Il pensiero 10 ms ha fatto il trucco. Working fiddle: http://jsfiddle.net/cww55/7/ – Teemu