各キーストローク間の時間をミリ秒単位で記録したいと思います(最初は1つのキー、「A」キー)。ユーザーは自分の作業を終えた後、各キーストローク間のタイミングを送信して確認できます。好き:
1:500 2:300 3:400 4:500 5:100 6:50 7:50 8:25
これはJavascriptで可能だと思いますよね?
各キーストローク間の時間をミリ秒単位で記録したいと思います(最初は1つのキー、「A」キー)。ユーザーは自分の作業を終えた後、各キーストローク間のタイミングを送信して確認できます。好き:
1:500 2:300 3:400 4:500 5:100 6:50 7:50 8:25
これはJavascriptで可能だと思いますよね?
もちろん:
var times = [];
// add an object with keycode and timestamp
$(document).keyup(function(evt) {
times.push({"timestamp":evt.timeStamp,
"keycode":evt.which})
});
// call this to get the string
function reportTimes() {
var reportString = "";
for(var i = 0; i < times.length - 1; ++i) {
reportString += (i+1) + ": " + (times[i+1].timestamp - times[i].timestamp) + " ";
}
return reportString; // add this somewhere or alert it
}
後で必要になった場合に備えて、キーコードを追加しました。正確な問題の説明には必要ありません。
コメントの議論からの明確化:
for
ループは ( は常に厳密に 未満であるため) までしか進まないtimes.length - 2
ためi
、配列の範囲外であってtimes.length - 1
も問題はありません。times[i+1]
たとえば、キーを 5 回押して、 5 つの要素 ( からまでtimes
のインデックス) を持つ配列がある場合:0
4
1st pass: times[1].timestamp - times[0].timestamp
2nd pass: times[2].timestamp - times[1].timestamp
3rd pass: times[3].timestamp - times[2].timestamp
4th pass: times[4].timestamp - times[3].timestamp
i
に設定する4
と終了条件がトリガーされるため、ループは終了します。
= i < times.length - 1
= 4 < 5 - 1
= 4 < 4
= false [i cannot be set to 4 by this loop]
したがって、times[i+1]
は常に有効にインデックス付けされた要素です。これi
は、 が最大インデックスより多くても 1 つ小さいためです。