Javascript 我如何避免在按下键事件中不断重复

Javascript 我如何避免在按下键事件中不断重复,javascript,jquery,html,Javascript,Jquery,Html,我有一个按键事件的代码。我的代码的工作原理是, 当我按下箭头向下键40时,此功能垂直滑动;开始工作。 但当我按40键两次,然后按38键,40键工作两次,完成后,38键开始工作 但我想做的是:当我按下403813键时 其他功能将立即停止。当前功能将启动 注意:我已经在stackoverflow中遵循了这个答案 如何在JavaScript中避免自动重新创建键控事件 在我的代码中: var allowed = true; $(document).keydown(function(e) { if (

我有一个按键事件的代码。我的代码的工作原理是, 当我按下箭头向下键40时,此功能垂直滑动;开始工作。 但当我按40键两次,然后按38键,40键工作两次,完成后,38键开始工作

但我想做的是:当我按下403813键时 其他功能将立即停止。当前功能将启动

注意:我已经在stackoverflow中遵循了这个答案

如何在JavaScript中避免自动重新创建键控事件

在我的代码中:

var allowed = true;
$(document).keydown(function(e) {
  if (e.repeat != undefined) {
    allowed = !e.repeat;
  }
  if (!allowed) return;
  allowed = false;

  if (controlsEnabled) {
    if (e.keyCode == 38) {
      allowed = true;
      verticalSlideDown();
      console.log("pressed key for Down : " + e.keyCode);
    }

    if (e.keyCode == 40) {
      allowed = true;
      verticalSlideUp();
      console.log("pressed key for Up: " + e.keyCode);
    }
    if (e.keyCode == 13) {
      allowed = true;
      var div = $(".scroll-inner-container");
      console.log("pressed key for stop : " + e.keyCode);
      div.stop();
    }
  }

});

添加一个变量,用于记忆按键的按键代码,并在listener函数中进行比较:

var allowed = true;
var previousKeyPress = null;
$(document).keydown(function(e) {
  if (e.repeat != undefined) {
    allowed = !e.repeat;
  }
  if (!allowed) return;
  allowed = false;

  if (controlsEnabled) {
    if (e.keyCode == 38 && previousKeyPress != 38) {
      allowed = true;
      verticalSlideDown();
      console.log("pressed key for Down : " + e.keyCode);
    }

    if (e.keyCode == 40 && previousKeyPress != 40) {
      allowed = true;
      verticalSlideUp();
      console.log("pressed key for Up: " + e.keyCode);
    }
    if (e.keyCode == 13  && previousKeyPress != 13) {
      allowed = true;
      var div = $(".scroll-inner-container");
      console.log("pressed key for stop : " + e.keyCode);
      div.stop();
    }
    previousKeyPress = e.keyCode;
  }

});

跟踪最后一个关键点,尝试以下操作

var allowed = true;
var last_key;
$(document).keydown(function(e) {
  if (e.repeat != undefined) {
    allowed = !e.repeat;
  }
  if (!allowed) return;
  allowed = false;

  if (e.keyCode == last_key){
     return;
  }

  if (controlsEnabled) {
    if (e.keyCode == 38) {
      allowed = true;
      verticalSlideDown();
      console.log("pressed key for Down : " + e.keyCode);
    }

    if (e.keyCode == 40) {
      allowed = true;
      verticalSlideUp();
      console.log("pressed key for Up: " + e.keyCode);
    }
    if (e.keyCode == 13) {
      allowed = true;
      var div = $(".scroll-inner-container");
      console.log("pressed key for stop : " + e.keyCode);
      div.stop();
    }

    last_key = e.keyCode;
  }

});

您可以用功能性的方式来实现这一点。易于测试并鼓励代码重用

例如:

常数ENTER=13; const RIGHT=39; 常数下降=40; const once=fn=>{ 设chached=null; 返回功能键{ return chached==key?void 0:chached=key,fn.applythis,参数 } } 常量记录器=log=>x=>logx; const include=keys=>key=>keys.indexOfkey>-1; $document.ready=>{ const allowedKeys=包含[输入,右,下]; const log=loggerconsole.log; const program=oncex=>{ 开关x{ 案例输入: logx 打破 案例权利: logx 打破 按大小写: logx 打破 违约: 记录“未处理的密钥” } }; $document.keydowne=>{ 如果允许Keyse.keyCode Program.keyCode }; };
谢谢@Catalin。你的代码可以运行。但是让我解释一下,让这个垂直滑动完成需要1分钟。如果我按40键,那么这个功能将开始。10秒钟后,如果我按38键,上一个功能将停止,当前功能将启动..就像机器人一样。当我按一个键时,其他功能将停止,当前功能将启动。是的,这是可能的,但当然这完全取决于您的verticalSlideUp和verticalSlideDown函数、它们的作用以及如何停止它们。一个简单的工作示例最好。非常感谢@Catalin这是我的Jsfiddle链接谢谢@Svetoslav。我也试过你的代码。你的代码也能用。但我想做的是,无论在什么情况下,如果我立即按304013键,其他功能将停止。当前功能将启动。谢谢@Tom,当我按其中任何一个键403813时,其他功能将立即停止。当前功能将启动。。这可能吗..?您的意思是停止当前正在运行的动画?您只需在verticalSlideUp/verticalSlideDown中的每个函数的开头添加div.stop。您已经在keyCode 13上有了它。我的意思是,当我按下其中任何一个键时,只会执行此功能。如果按40,然后再按38,则此Key40功能将停止。此30功能将立即启动。这里是我的代码链接是的,我想你的意思是,如何停止动画,如果我得到正确的。你需要像这样阻止它: