在我的网络应用程序中,我使用onkeydown事件来捕获击键。
例如,我捕获了“j”键来动画向下滚动页面(同时做一些其他的事情)。
我的问题是用户可能会按住“j”键向下滚动页面(这相当于快速多次击键)。
在我的应用程序中,这会导致一系列看起来不太好的动画。
我如何知道密钥何时被释放,以及我应该捕获多少次按键?这样我就可以运行一个长动画而不是多个短动画。
在我的网络应用程序中,我使用onkeydown事件来捕获击键。
例如,我捕获了“j”键来动画向下滚动页面(同时做一些其他的事情)。
我的问题是用户可能会按住“j”键向下滚动页面(这相当于快速多次击键)。
在我的应用程序中,这会导致一系列看起来不太好的动画。
我如何知道密钥何时被释放,以及我应该捕获多少次按键?这样我就可以运行一个长动画而不是多个短动画。
以@JMD 为基础:
var动画=假; 函数启动动画() { 动画=真; 运行动画(); } 函数停止动画() { 动画=假; } 函数运行动画() { 如果(动画结束) { 如果(!动画) { 返回; } 返回开始动画(); } // 动画代码 变量超时 = 25; setTimeout(function(){runanimation();},timeout); } document.onkeydown = 开始动画; document.onkeyup = 停止动画;
但是,您需要为开始/结束动画添加一些检查。
编辑:return
在 JS 中添加了一个;会无休止地递归。
您可以在 keyDown 上启动动画,而不是尝试堆叠动画,如果在动画结束时您还没有收到 keyUp,则启动另一个动画。一旦你到达动画的结尾并且你确实有 keyUp 然后你就完成了。
您可以尝试使用我的 repsonsiveness 插件,请参阅: http ://notetodogself.blogspot.com/2008/12/jquery-responsiveness-plugin-for-fast.html
在此处查看演示:http: //doesthatevencompile.com/current-projects/jquery.responsiveness/
您可以快速输入内容的那个。您可以根据自己的需要进行调整。像这样:动画事件将与插件绑定,并在用户停止快速执行某项操作时执行。您可以通过事件的正常绑定来计算他做了多少次快速的事情。
setTimeout
返回一个计时器 ID。所以我要做的是在你收到 keyDown 事件后,我会启动一个等待时间很短的计时器,如下所示:
var globalTimerId = -1;
var keyDownCount = 0;
function handleKeyDown(e) {
if (globalTimerId != -1) {
clearTimeout(globalTimerId);
keyDownCount++;
}
/* 500 means 1/2 a second, adjust for your needs */
globalTimerId = setTimeout(handleKeyDownAfterWait, 500);
keyDownCount = 1;
}
function handleKeyDownAfterWait() {
globalTimerId = -1;
/* keyDownCount will have the number of times handleKeyDown was called */
}
所以想法是每次接收到 keyDown 事件时,计时器都会被清除(假设它还没有过去)并重新启动。如果计时器到期,则用户已松开密钥,您可以在handleKeyDownAfterWait
.
然而,jQuery 或其他 JS 库可能还有其他更优雅的解决方案。这只是一些快速而肮脏的东西(并且可能是错误的;))