jQuery / Javascript:在按住组合键时运行一个功能,在释放键时运行另一个功能

时间:2018-08-14 08:00:38

标签: javascript jquery

我想要一些需要用户记住数字的任务代码。该任务应如下工作:

用户必须按下三个键的组合才能显示他们需要记住的数字。这些可以是任何三个键,只要需要用户双手就可以使用(想法是防止他们写下应该记忆的数字)。

当他们开始按住键时,将显示数字并启动计时器。如果他们在所需的时间段内(15秒)持续按住按键,则功能会自动运行(这是他们在记住数字时必须执行的另一项任务)。

但是,如果他们在15秒内释放键,则会运行其他功能。此功能只是告知他们他们过早释放了按键,当他们单击按钮时,任务会以新的数字重新启动。

我当前拥有的代码如下:

var mapDown = {}; // Global object to store keydown events
var mapUp = {}; // Global object to store keyup events

此函数使用numberFunc()函数(未显示)生成要存储的随机数并运行该页面。

function keyDownFunc() {
  mapDown = {};
  mapUp = {};
  memoryNum = numberFunc(); 
  $('#experimentDisplay').load('./html/numberTest.html');
  $('#experimentDisplay').show();
}

下面的函数在上面调用的页面的脚本中。它显示要存储在名为“ numberTestDiv”的div中的数字。目前(为简单起见),它已设置为在按住“ p”和“ q”键时运行。

<script>
onkeydown = onkeyup = function(e){
    e = e || event; // to deal with IE
    mapDown[e.keyCode] = e.type == 'keydown';
    mapUp[e.keyCode] = e.type == 'keyup';

    if(mapDown[80] && mapDown[81]) {
       $("#numberTestDiv").html(memoryNum);
       timer = setTimeout(runTrial, 15000);
     }; // run the function runTrial() if the keys are held down for the requisite period

     if (mapUp[80] || mapUp[81]) {
       mapDown = {};
       clearTimeout(timer);
       keyUpFunc(); // stop the timer and run the function keyUpFunc() if either of the keys are released too early
     }

}
</script>

如果用户过早释放按键,则会调用keyUpFunc函数。这将清除mapDown和mapUp对象以及计时器,并将用户带到一个页面,用户可以单击该页面再次启动该过程。

function keyUpFunc() {
  mapDown = {};
  mapUp = {};
  clearTimeout(timer);
  $('#experimentDisplay').load('./html/keyUp.html');
  $('#experimentDisplay').show();
}

上述内容有两个问题。

1)如果用户按住这些键并继续执行主要任务,则屏幕会闪烁一段时间-我认为由于扩展键所产生的所有事件。我无法解决如何避免这种情况。我读过修饰键会自动重复

2)clearTimeout()函数似乎不起作用。如果用户提前释放了键,直接转到keyUpFunc函数,然后再次启动keyDownFunc函数,则他们不必按住'p'和'q'键15秒钟(或根本不需要)就可以继续操作。 runTrial函数。

咨询的其他答案包括: JavaScript multiple keys pressed at once Get a list of all currently pressed keys in Javascript Run code after some time has passed or a condition is met

1 个答案:

答案 0 :(得分:1)

添加一个用于存储同时按下两个按钮的代码的标志,然后将其用作运行代码的条件应该可以解决您的问题。当您按住按钮或将按钮抬起时,这基本上只会使代码停止运行数百次。这是一些示例代码:

Object.values(json_element -> 'variants')