【问题标题】:Event Handler function in prototype's method, why does it think .keyCode is a property of undefined in JavaScript?原型方法中的事件处理函数,为什么它认为.keyCode是JavaScript中未定义的属性?
【发布时间】:2014-12-29 00:10:44
【问题描述】:

我正在尝试使用 DOM 事件处理程序,并且我在构造函数的原型中放入了一个适用于 DOM div 元素的函数,该元素是构造函数在我的对象中创建的属性。它正确显示对象,但唯一不起作用的是它认为在我的方法.keyCode 中是未定义的属性并给我一条错误消息:

TypeError:无法读取未定义的属性“keyCode”(函数 KeyBlock.move 中的第 16 行)

这是我的方法,以及我对它的调用:

  KeyBlock.prototype.move = function(event) {
  if(event.keyCode == 37)
    this.x -= 1;
  if(event.keyCode == 38)
    this.y -= 1;
  if(event.keyCode == 39)
    this.x += 1;
  if(event.keyCode == 40)
    this.y += 1;
  if (this.y < 0)
    this.y = 0;
  if (this.x < 0)
    this.x = 0;
  console.log(this.y);
}
me = new KeyBlock("me");
addEventListener("keyup", me.move(event));

可能与方法中的参数event 有关?要回答这个问题,不需要我的构造函数本身,但我也会将它放在(在此文本下方),以明确我在做什么。

  var KeyBlock = function(name) {
  this.character = document.createElement("div");
  document.body.appendChild(this.character);
  this.character.style.width = "20px";
  this.character.style.height = "20px";
  this.name = name;
  this.x = 0;
  this.y = 0;
  this.character.style.background = "indigo";
  this.character.id = this.name;
  this.character.style.left = String(this.x) + "px";
  this.character.style.top = String(this.y) + "px";
}

【问题讨论】:

    标签: javascript dom methods constructor event-handling


    【解决方案1】:

    您在addEventListener 调用中调用您的方法(带有未定义的event 参数),而不是传递它。

    addEventListener("keyup", me.move(event));

    应该是

    addEventListener("keyup", me.move);

    要访问您的 this 属性,您还需要 bind 函数:

    addEventListener("keyup", KeyBlock.prototype.move.bind(me));

    【讨论】:

    • 这仍然没有更新我的this.character.style.left.top,但它确实更新了我的this.xthis.y,那是因为它占用了我原来的this.x 和@987654333 @ 作为常量并且不会将它们更新为其他属性?如果是这样,我该如何解决这个问题?
    • 您正在从 this.x 构建一个 CSS 值字符串,当 this.x 更改时您需要再次执行此操作。请将此答案标记为正确,不要在 cmets 中提出新问题,为新问题创建一个新问题或找出答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2015-03-14
    相关资源
    最近更新 更多