获取乒乓球游戏的钥匙号时,无法读取未定义的属性“ keyCode”

时间:2019-05-19 21:51:08

标签: javascript keycode

我正在创建一个乒乓球游戏,并且正在实现桨的移动功能。但是,当我尝试获取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'属性'”错误。

1 个答案:

答案 0 :(得分:3)

您的函数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函数是完全不必要的,并且可能会导致错误-所以我也将其删除。