我正在创建一个乒乓球游戏,并实现了桨的移动功能。但是,当我尝试获取keyCode来查看它们是否试图向上或向下移动时,会出现此错误。

我尝试使用console.log进行几乎所有操作,以帮助找出问题所在,并查找如何在线进行操作,但没有任何帮助。

//javascript to get keyCode for wasd paddle
function getWasdKey(e){
 var key = e.keyCode;
  if(key == 87){
    return true;
  }
  if(key == 83){
    return false;
  }
}
//javascript to get keyCode for arrow paddle
function getArrowKey(e){
  var key = e.keyCode;
  if(key == 38){
    return true;
  }
  if(key == 40){
    return false;
  }
}
//where I use the get key functions
function paddleArrowMove(){
  var paddlearrowtop = getStyle('paddlearrow', 'top');
    if(getArrowKey == true){//up
    setStyle('paddlearrow', 'top', paddlearrowtop - 5);
  }
  if(getArrowKey == false){//down
    setStyle('paddlearrow', 'top', paddlearrowtop + 5);
  }
}
function paddleWasdMove(){
  var paddlewasdtop = getStyle('paddlewasd', 'top');
  if(getWasdKey == true){//up
    setStyle('paddlewasdtop', 'top', paddlewasdtop - 5);
  }
  if(getWasdKey == false){//down
    setStyle('paddlewasdtop', 'top', paddlewasdtop + 5);
  }
}

//html to run the javascript
<body onload="startIntervals();" onkeypress="getArrowKey(); getWasdKey();">


我希望桨叶会上下移动,但会出现“无法读取未定义的'keyCode'属性'”错误。

最佳答案

函数getArrowKeygetWasdKey带有参数e,您显然希望将其用作相应事件的事件对象。但是,您不带任何参数调用它们:

onkeypress="getArrowKey(); getWasdKey();"


当您使用Javascript调用函数而未能传递其所有形式参数时,假定您不提供的任何内容都是undefined。这就是e在这里发生的情况,并引起您的错误。

由于使用on*属性通常不是一个好主意,因此我建议通过使用Javascript添加事件侦听器来解决此问题。除了诸如将内容和逻辑之间的关注点分离之类的其他好处外,传递给addEventListener的函数在调用时会自动随事件对象作为其参数提供。

因此删除此:

onkeypress="getArrowKey(); getWasdKey();"


body元素中添加,然后将其添加到您的Javascript中:

document.body.addEventListener("keypress", function(e) {
    getArrowKey(e);
    getWasdKey(e);
});


另外,正如@connexo正确指出的那样,您的startIntervals函数是完全不必要的,并且可能会导致错误-因此我也将其删除。

10-07 19:20
查看更多