如何禁用我呼叫的事件监听器?

问题描述 投票:-1回答:1

我在键盘上按键盘上的1(即keyCode中的49)时,会在第一个功能内分配一个事件侦听器,它将触发第一个功能,该功能将在您尝试按A和S时对其进行控制。然后,如果我按下键盘上的2(即keyCode中的50),它将触发第二个功能,该功能将在您每次按下D和F时进行操作。我的问题是在调用第一个函数然后调用第二个函数之后,如何禁用第一个函数以防止按下A和S?简而言之,如何在每次调用新函数时禁用我调用的函数的事件侦听器?

<body>

</body>
<script>
    document.body.addEventListener('keydown',function(e){
        if(e.keyCode == 49){
            document.body.addEventListener('keydown',function(e){
                switch(e.keyCode){
                    case 65:
                    console.log('you pressed A')
                    break;
                    case 83:
                    console.log('you pressed s')
                    break
                }
            })
        }else if(e.keyCode == 50){
            document.body.addEventListener('keydown',function(e){
                switch(e.keyCode){
                    case 68:
                    console.log('you pressed d')
                    break;
                    case 70:
                    console.log('you pressed f')
                    break
                }
            })
        }
    });
</script>
javascript dom
1个回答
0
投票

要删除事件侦听器,该函数必须具有要引用的名称,以便您可以引用要删除的事件侦听器。例如:

function myFunction() {
  // code here
}
document.body.addEventListener("keydown", myFunction);

并删除它:

document.body.removeEventListener("keydown", myFunction);

没有为名称分配功能,JavaScript不知道要删除哪个事件侦听器,因为您可以将多个功能绑定到一个元素。

所以要更改您的代码,应该是:

document.body.addEventListener("keydown",function(e) {
  if (e.keyCode == 49) {
    document.body.addEventListener("keydown", verticalMoves);
  } else if (e.keyCode == 50) {
    document.body.addEventListener("keydown", horizontalMoves);
  }
}

function verticalMoves(e) {
  switch(e.keyCode) {
    case 65: console.log("you pressed A"); break;
    case 83: console.log("you pressed S"); break;
  }
  document.body.removeEventListener("keydown", verticalMoves);
}
function horizontalMoves(e) {
  switch(e.keyCode) {
    case 68: console.log("you pressed D"); break;
    case 70: console.log("you pressed F"); break;
  }
  document.body.removeEventListener("keydown", horizontalMoves);
}
© www.soinside.com 2019 - 2024. All rights reserved.