2011-06-20 28 views
16

プレーンなJS/JQueryでマウスの速度を追跡する最適な方法は何ですか?私はどのくらい速くユーザーがすべての方向(上/下/左/右)でマウスを動かすかを追跡したいと思います。あなたが何かのために速度を得るマウス速度をJSで追跡する

答えて

15

Sparklines has a nifty exampleマウスの動きを追跡し、グラフ化します。彼らのコードは、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; 
}); 
+0

完全なスニペットを表示します - https://gist.github.com/ripper234/5757309 – ripper234

+0

このソリューションはマウスの距離のみを追跡しますか?なぜ距離はxとy座標の差の最大値であり、差の2乗の和ではないのですか?そして、 'mrefreshinterval'は"定義済み "属性ですか?私はあなたがそれをどのように使用するかわかりません。ありがとう。 – Dambo

7

同じ方法:

speed = distance/time 

acceleration = speed/time 

と使用:

$(document).mousemove(function(e){ 
    var xcoord = e.pageX; 
    var ycoord = e.pageY; 
}); 

マウスは、マウスが移動するたびに座標取得します。

+3

はい、正しい時間を持つには少なくとも2回のマウス移動が必要です。マウスを[5、5]に移動してから10秒間凍結したとします。その後、あなたはすぐに[10、5]に移動し、タイムスタンプを記録したのは[5、5]になったときに出力が10ピクセルで10ピクセルになります。私はマウスの動きを知っていますが、最初の実際の動きはそれほど重要ではありません。なぜなら、より多くのトリガーをかけているからです。しかし、私はタッチでもこれを試しています。 – treznik

+0

私は@treznikに同意しますが、変数 "time"からどのように値を取得するかはコードからはっきりしません。 – S4M

+0

jsfiddle @connorで表示してください – ShibinRagh

6
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; 
}); 
+2

コードに説明を追加してください。なぜあなたはそれが答えだと思いますか?前の回答が正しくない、または非効率的ですか?あるいは、あなたはその問題に異なるアプローチを見せたいでしょうか?コードブロックを投稿するだけの答えはありません。 – Artemix

+0

これは、間隔を使用するのではなく、より正確です。すべての反復(最初を除く)では、速度を知るでしょう。区間を使用するときは平均速度(この区間)があります。 – verybadbug

2

これは、あなたが、追跡を開始、一時停止して、非常に迅速に指やマウスを動かすことができ、実際に対抗する方法である(touch上で突然のフリックをするとします。ここでは

はコードがあります画面)。

var time = 200 
var tracker = setInterval(function(){ 
    historicTouchX = touchX; 
}, time); 

document.addEventListener("touchmove", function(){ 
    speed = (historicTouchX - touchX)/time; 
    console.log(Math.abs(speed)); 
}, false); 

私はこの例ではtouchXのみでこれを行っています。アイデアは、200ミリ秒ごとにx位置のスナップショットを撮り、それを現在の位置から取って200(速度=距離/時間)で割ることです。これにより、速度の最新情報が維持されます。時間はミリ秒で、出力は200ミリ秒あたりの移動ピクセル数になります。

関連する問題