【发布时间】:2014-10-27 10:10:40
【问题描述】:
我正在开发一个对时间非常敏感的应用程序,它使用按键进行用户输入。当我在这里谈论毫秒时,我继续尝试了这样的版本:
function start() {
//stim.style.display = "block";
rt_start = new Date().getTime();
response_allowed = 1;
}
function end() {
var t = rt_end - rt_start;
//stim.style.display = "none";
log.innerHTML = t;
i++;
if (i < iterations) {
setTimeout('start();', 1000);
}
}
var rt_start;
var rt_end;
var iterations = 100;
var i = 0;
var response_allowed = 0;
var stim;
var log;
$(document).ready(function() {
document.onkeydown = function(e) {
if (response_allowed == 1) {
rt_end = new Date().getTime();
response_allowed = 0;
end();
}
};
stim = document.getElementById('stim');
log = document.getElementById('log');
start();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="log"></div>
<img src="https://www.gravatar.com/avatar/cfefd93404e6b0eb3cde02b4b6df4e2b?s=128&d=identicon&r=PG&f=1" id="stim" />
而且它工作正常,通常是低于 5 毫秒的计时器(只需按住一个键)。但是一旦我修改代码以显示图像(取消注释这两行),这会减慢很多到大约 30 毫秒。
有人能告诉我为什么会出现这种情况以及如何避免这种额外的延迟吗?
谢谢
【问题讨论】:
-
你能提供一个jsfiddle吗?
-
旁注:几乎没有任何理由将字符串传递给
setTimeout/setInterval,还有几个不的原因。相反,传递对您要调用的函数的引用:setTimeout(start, 1000); -
jsfiddle 由于 setTimeout 似乎不起作用?至少我不能让它早点工作,对不起。字符串的传递是由于我在原始脚本中传递多个函数/动作的方法,例如显示 div,更改其内容等。这些是链接在一起的各种操作。编辑:动作是高度可变的,所以没有办法为每个动作定义一个函数。
-
@KarstenSender:jsFiddle 可以使用
setTimeout(jsfiddle.net/gcvtaxfm),但我已经更新了您的问题,将您的代码转换为 Stack Snippet(我使用了您的 gravatar,而不是test.png)。 -
FWIW,在上面的版本中,按住一个键会给我大约 23 毫秒范围内的值。 (按住一个键意味着我们正在等待 keyrepeat,不是吗?)
标签: javascript jquery timing onkeydown