【问题标题】:Get calling Event inside of Class-Function without Parameter in JavaScript在 JavaScript 中不带参数的类函数中调用事件
【发布时间】:2021-08-19 20:46:50
【问题描述】:

我有一个这样的简单输入处理类:

class Key
{
    static enter(event, handler)
    {
        if (event.keyCode === 13) {
            $handler();
        }
    }
}

它被称为<div onkeydown="Key.enter(event, customFunction)"></div>

我希望能够在 Key.enter() 中获取事件,而不必总是将其传递给函数。我知道在普通函数中this.event 会起作用,但这不起作用,可能是因为我在一个类中。

任何想法如何仍然获取调用该函数的事件以便我可以像Key.enter(customFunction) 一样调用它?

更新:将函数设为静态,它已经在我的代码中,但忘记写在问题中。

【问题讨论】:

  • 如果要在没有实例的情况下调用它,则需要将其设为静态方法。
  • 真的不应该在这里使用class
  • 普通函数中没有this.event这样的东西。
  • 在普通函数中,this 是全局对象,所以this.eventevent 全局变量。这不是标准的全局变量,但它适用于某些浏览器(但不适用于 Firefox)。
  • 停止在 html 中使用内联属性事件处理程序 - 请参阅 onclick="" vs event handler。编写一个可以用作element.onclick = onlyEnterKey(customFunction); 的辅助函数很容易

标签: javascript class event-handling dom-events


【解决方案1】:

当事件处理程序被调用时,实际的事件将作为一个全局变量event(或window.event,参见MDN),因此事件对象可以从事件处理程序访问,而无需通过它直接。在下面的示例中,单击一个正方形使其成为焦点,然后按任意键。按下的键将被打印到日志中。

请注意“您应该避免在新代码中使用此属性,而应该使用传递给事件处理函数的事件”(有关详细信息,请参阅MDN)。

// 1. Function
function onKeyDown() {
  console.log("onKeyDown() ->", event.key);
  event.preventDefault();
}

// 2. Method
class A {
  onKeyDown() {
    console.log("new A().onKeyDown() ->", event.key);
    event.preventDefault();
  }
}

// 3. Static method
class B {
  static onKeyDown() {
    console.log("B.onKeyDown() ->", event.key);
    event.preventDefault();
  }
}
.square {
  display: inline-block;
  width: 100px;
  height: 100px;
  background: lightblue;
  text-align: center;
  vertical-align: middle;
  line-height: 100px;
  font-family: Arial, Helvetica, sans-serif;
  font-size: 10pt;
}

.square:focus {
  outline: solid 1px blue;
}
<div class="square" tabIndex="0" onkeydown="onKeyDown()">Function</div>
<div class="square" tabIndex="0" onkeydown="new A().onKeyDown()">Method</div>
<div class="square" tabIndex="0" onkeydown="B.onKeyDown()">Static Method</div>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
相关资源
最近更新 更多