2017-03-23 49 views
2

目标:为按键动态收集数据(停留时间,飞行时间,从下到下的时间...)。如果快速键入,键盘停留/保持时间不正确

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

问题:当我输入快速时,我能够正确地获得飞行时间,但停留时间混乱起来。

最小的,完整的和可核查的例子https://jsfiddle.net/nirajpandkar/600orotn/

例如用于再现错误,你可以尝试在同一时间键入单词“the”慢慢地,一个字。停留时间如下 -

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

的原因错误是快速打字时,它可以为​​到以前keyup之前进行发射。因此dwellTime可能未被重置。

为了减轻您可以在dwellTime存储在每个键代码基础的问题,使其夫妇​​与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(),因此您不必向下滚动查看新引发的事件。另外,我改变了逻辑,所以如果一个键被按下,就像你以前的逻辑没有那样。如果您不需要这种行为,您可以简单地从​​事件处理程序中删除if条件。

+0

啊,解释它!欣赏敏捷:)谢谢! –