键入快速键时,按键停留时间不正确

时间:2017-03-23 16:14:23

标签: javascript jquery keyevent keystroke

目标:收集按键动态的数据(停留时间,飞行时间,停机时间......)。

完成的事情:成功获得两次击键之间的飞行时间。

问题:当我快速打字时,我能够正确地获得飞行时间,但是停留的时间会变得混乱。

最小,完整且可验证的示例https://jsfiddle.net/nirajpandkar/600orotn/

例如,为了重现错误,您可以尝试输入单词""慢慢地,一次一个字。停留时间如下 -

Pressed key 84 for 0.107

Pressed key 72 for 0.091

Pressed key 69 for 0.091

现在尝试输入字母' t'并且' h'在""尽可能快(你不必努力)。停留时间是 -

Pressed key 84 for 0.008

Pressed key 72 for 1490285526.868

Pressed key 69 for 0.074

问题:为什么会发生这种情况以及如何解决?

1 个答案:

答案 0 :(得分:2)

错误的原因是,当快速输入时,keydown可以在之前keyup之前触发。因此,dwellTime可能尚未重置。

为了缓解此问题,您可以将dwellTime存储在每个keyCode的基础上,以便它将keydown与该给定密钥的keyup耦合,如下所示:

var dwellTimes = {};
$('#inputbox').keydown(function(e) {
  if (!dwellTimes[e.which])
    dwellTimes[e.which] = new Date().getTime();
});

$('#inputbox').keyup(function(e) {
  var dwellTime = new Date().getTime() - dwellTimes[e.which];
  delete dwellTimes[e.which];

  $('#output').prepend("<p>Pressed key " + e.which + " for " + dwellTime / 1000 + "</p>");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="inputbox" type='text'>
<div id="output"></div>

请注意,我在此示例中使用了prepend(),因此您无需向下滚动即可查看新引发的事件。此外,我更改了逻辑,以便在按下dwellTime帐户时按下该键,因为您之前的逻辑没有。如果您不需要这种行为,只需从if事件处理程序中删除keydown条件。