使用JS跟踪鼠标速度

dan*_*oen 18 javascript mouse performance

使用普通的JS/JQuery跟踪鼠标速度的最佳方法是什么?我想跟踪用户在所有方向上移动鼠标的速度(上/下/左/右).

Jon*_*han 14

Sparklines有一个很好的跟踪鼠标移动和绘制图形的例子.从第315行开始,他们的代码可在其网站的源代码中找到.

简单有效.

这是代码:

 var mrefreshinterval = 500; // update display every 500ms
 var lastmousex=-1; 
 var lastmousey=-1;
 var lastmousetime;
 var mousetravel = 0;
 $('html').mousemove(function(e) {
     var mousex = e.pageX;
     var mousey = e.pageY;
     if (lastmousex > -1)
         mousetravel += Math.max( Math.abs(mousex-lastmousex), Math.abs(mousey-lastmousey) );
     lastmousex = mousex;
     lastmousey = mousey;
 });
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案仅跟踪鼠标距离吗?为什么距离是x和y坐标差的最大值而不是差平方的和?mrefreshinterval是“预定义”属性吗?我看不到你如何使用它。谢谢。 (2认同)
  • “lastmousetime”在这里甚至不用,时间是速度的关键组成部分。这看起来像是一般行驶距离的近似值 (2认同)

小智 8

var timestamp = null;
var lastMouseX = null;
var lastMouseY = null;

document.body.addEventListener("mousemove", function(e) {
    if (timestamp === null) {
        timestamp = Date.now();
        lastMouseX = e.screenX;
        lastMouseY = e.screenY;
        return;
    }

    var now = Date.now();
    var dt =  now - timestamp;
    var dx = e.screenX - lastMouseX;
    var dy = e.screenY - lastMouseY;
    var speedX = Math.round(dx / dt * 100);
    var speedY = Math.round(dy / dt * 100);

    timestamp = now;
    lastMouseX = e.screenX;
    lastMouseY = e.screenY;
});
Run Code Online (Sandbox Code Playgroud)

  • 请在代码中添加一些说明.为什么你认为这是一个答案?以前的答案是不正确还是低效?或者您可能希望针对该问题展示不同的方法?仅发布一段代码不是答案. (3认同)

小智 7

同样的方式你获得其他任何东西的速度:

speed = distance / time

acceleration = speed / time 
Run Code Online (Sandbox Code Playgroud)

并使用:

 $(document).mousemove(function(e){
     var xcoord = e.pageX;
     var ycoord = e.pageY;
 }); 
Run Code Online (Sandbox Code Playgroud)

鼠标移动时获取鼠标坐标.

  • 是的,但您需要至少两次鼠标移动才能拥有正确的时间.假设您将鼠标移动到[5,5]然后冻结了10秒钟.然后你会在一瞬间快速移动到[10,5],输出在10秒内将是10个像素,因为当你最后一次记录时间戳时[5,5].我知道对于鼠标移动而言,第一次实际移动通常并不重要,因为你会触发更多,但我也尝试这种移动,如果你快速滑动,你可能只有一个动作. (5认同)

Ste*_*rya 5

使用当前的现代浏览器,我们现在可以使用moveXmoveY来检测鼠标的移动速度。在您想使用它之前,您应该查看兼容性表,因为较旧的浏览器将具有类似webkitMovementX.

document.addEventListener("mousemove", function(ev){
    console.log(`Movement X: ${ev.movementX}, Y: ${ev.movementY}`);
}, false);
Run Code Online (Sandbox Code Playgroud)

上面的结果不是像像素/秒这样的平均速度,而是触发mousemove事件之间的总移动。如果你需要,px/s那么你可以像下面这样做:

var totalX = 0;
var totalY = 0;
var moveX = 0;
var moveY = 0;

document.addEventListener("mousemove", function(ev){
    totalX += Math.abs(ev.movementX);
    totalY += Math.abs(ev.movementY);
    moveX += ev.movementX;
    moveY += ev.movementY;
}, false);

setInterval(function(){
    console.log(`Speed X: ${totalX}px/s, Y: ${totalY}px/s`);
    console.log(`Movement X: ${moveX}px/s, Y: ${moveY}px/s`);
    moveX = moveY = totalX = totalY = 0;
}, 1000);
Run Code Online (Sandbox Code Playgroud)

负数表示向左或顶部移动,而正数表示向底部或向右移动。