目标:收集按键动态的数据(停留时间,飞行时间,停机时间......)。
完成的事情:成功获得两次击键之间的飞行时间。
问题:当我快速打字时,我能够正确地获得飞行时间,但是停留的时间会变得混乱。
最小,完整且可验证的示例: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
问题:为什么会发生这种情况以及如何解决?
答案 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
条件。