Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript键控定时_Javascript_Jquery_Timing_Onkeydown - Fatal编程技术网

Javascript键控定时

Javascript键控定时,javascript,jquery,timing,onkeydown,Javascript,Jquery,Timing,Onkeydown,我正在开发一个对时间非常敏感的应用程序,它使用按键进行用户输入。当我在这里谈论毫秒时,我继续尝试了这样一个版本: 函数开始(){ //stim.style.display=“块”; rt_start=new Date().getTime(); 允许响应_=1; } 函数结束(){ var t=rt_结束-rt_开始; //stim.style.display=“无”; log.innerHTML=t; i++; if(i

我正在开发一个对时间非常敏感的应用程序,它使用按键进行用户输入。当我在这里谈论毫秒时,我继续尝试了这样一个版本:

函数开始(){
//stim.style.display=“块”;
rt_start=new Date().getTime();
允许响应_=1;
}
函数结束(){
var t=rt_结束-rt_开始;
//stim.style.display=“无”;
log.innerHTML=t;
i++;
if(i<迭代次数){
setTimeout('start();',1000);
}
}
var rt_启动;
var rt_end;
var迭代次数=100;
var i=0;
var响应_允许=0;
var-stim;
var测井;
$(文档).ready(函数(){
document.onkeydown=函数(e){
如果(允许的响应=1){
rt_end=new Date().getTime();
允许响应_=0;
end();
}
};
stim=document.getElementById('stim');
log=document.getElementById('log');
start();
});

我建议在可用的地方使用(对于不提供的浏览器,使用)

这是一个高分辨率的时间戳(设计时考虑到精确的测量),用于(例如)导航计时和Web性能API(在Mozilla开发者网络中搜索,因为我不能在一篇文章中共享两个以上的链接)

获取DOMHighResTimeStamp的快速方法-非常像使用
var ts=new Date().getTime()所做的获取常规毫秒时间戳-是:

var ts=performance.now()

正如我上面所说的,看看MDN上的Web性能API。如果您的应用程序对时间非常敏感,这将非常有帮助

编辑:

关于您的代码片段,在我看来,如果您按下一个键,您将始终被限制在keydown事件的解析范围内(该事件持续触发,但不是每毫秒触发)。如果使用文本编辑器向下(连续)按字符键并检查每秒写入字符的次数,则可以很容易地看到此行为。我想,这是通过操作系统设置来控制的


您还被限制为与setTimeout/setInterval相关的“漂移”。您可以看到,setTimeout在给定的延迟后将某些内容排队等待执行,但它不能保证及时执行。这是一个“尽力而为”的场景,如果浏览器忙着做某事,它将显著漂移。含义:如果您使用setTimeout在1秒后重新启用允许的
响应
变量,您可以期望它在“大约”(但不完全)1秒后重新启用它。

您能提供一个JSFIDLE吗?旁注:几乎没有任何理由将字符串传递到
setTimeout
/
setInterval
,还有几个理由不这样做。相反,传入对要调用的函数的引用:
setTimeout(start,1000)由于设置超时,JSFIDLE似乎无法工作?对不起,至少我不能早点把它修好。字符串的传递是由于我在原始脚本中传递多个函数/操作的方法,例如显示div、更改其内容等。这些是链接在一起的各种操作。编辑:操作是高度可变的,因此无法为每个操作定义一个函数。@KarstenSsender:JSFIDLE可以使用
setTimeout
(),但我已更新了您的问题,将代码转换为堆栈片段(我使用了gravatar而不是
test.png
)。FWIW,使用上述版本,按住一个键可以得到~23ms范围内的值。(按住一把钥匙意味着我们在等钥匙,不是吗?)嗨,谢谢你的回答。我已经测试了performance.now(),但它似乎导致了比Date.now()更高的负载(请参阅)。setTimeout的延迟在这里应该没有问题,因为我只在函数中开始计时,因此忽略了迭代之间的1000ms(或多或少)。正如@TJCrowder所提到的,更大的问题可能是keydown事件中存在延迟。这一点已经(在某种程度上)通过一个名为keycridge()的小程序得到确认和修复。谢谢