2

在我的网络应用程序中,我使用onkeydown事件来捕获击键。

例如,我捕获了“j”键来动画向下滚动页面(同时做一些其他的事情)。

我的问题是用户可能会按住“j”键向下滚动页面(这相当于快速多次击键)。

在我的应用程序中,这会导致一系列看起来不太好的动画。

我如何知道密钥何时被释放,以及我应该捕获多少次按键?这样我就可以运行一个长动画而不是多个短动画。

4

4 回答 4

2

@JMD 为基础

var动画=假;

函数启动动画()
{
  动画=真;
  运行动画();
}

函数停止动画()
{
  动画=假;
}

函数运行动画()
{
  如果(动画结束)
  {
    如果(!动画)
    {
      返回;
    }

    返回开始动画();
  }

  // 动画代码

  变量超时 = 25;
  setTimeout(function(){runanimation();},timeout);
}

document.onkeydown = 开始动画;
document.onkeyup = 停止动画;

但是,您需要为开始/结束动画添加一些检查。

编辑:return在 JS 中添加了一个;会无休止地递归。

于 2009-02-12T23:03:21.853 回答
1

您可以在 keyDown 上启动动画,而不是尝试堆叠动画,如果在动画结束时您还没有收到 keyUp,则启动另一个动画。一旦你到达动画的结尾并且你确实有 keyUp 然后你就完成了。

于 2009-02-12T22:54:05.930 回答
1

您可以尝试使用我的 repsonsiveness 插件,请参阅: http ://notetodogself.blogspot.com/2008/12/jquery-responsiveness-plugin-for-fast.html

在此处查看演示:http: //doesthatevencompile.com/current-projects/jquery.responsiveness/

您可以快速输入内容的那个。您可以根据自己的需要进行调整。像这样:动画事件将与插件绑定,并在用户停止快速执行某项操作时执行。您可以通过事件的正常绑定来计算他做了多少次快速的事情。

于 2009-02-12T22:59:05.980 回答
1

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 库可能还有其他更优雅的解决方案。这只是一些快速而肮脏的东西(并且可能是错误的;))

于 2009-02-12T23:02:50.370 回答