Javascript onkeydown事件只开一次?

Win*_*ker 9 javascript javascript-events

Heylo伙计们,

我想让onkeydown事件只触发一次函数.要再次触发该功能,用户必须释放该键并再次按下/按住.我知道它相当简单,但我是JS新手.此外,我更喜欢避免使用jquery或其他库.还有一件事,这应该适用于ie和firefox.

非常感谢!

kar*_*ral 41

我很惊讶它没有被提及,还有event.repeat

document.addEventListener('keydown', (e) => {
  if (e.repeat) return;

  console.log(e.key);
});
Run Code Online (Sandbox Code Playgroud)

每次按键只会触发一次,因为按住按键后event.repeat会转动。true

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key#keyboardevent_sequence


Fel*_*ing 20

你可以设置一个标志:

var fired = false;

element.onkeydown = function() {
    if(!fired) {
        fired = true;
        // do something
    }
};

element.onkeyup = function() {
    fired = false;
};
Run Code Online (Sandbox Code Playgroud)

或者取消绑定并重新绑定事件处理程序(可能更好):

function keyHandler() {
     this.onkeydown = null;
     // do something
}

element.onkeydown = keyHandler;

element.onkeyup = function() {
    this.onkeydown = keyHandler;
};
Run Code Online (Sandbox Code Playgroud)

有关"传统"事件处理的更多信息.

您可能还想使用addEventListenerattachEvent绑定事件处理程序.有关这方面的更多信息,请查看quirksmode.org - 高级事件注册模型.


Ali*_*r R 6

您可以使用一个“once”参数

https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

例如:

element.addEventListener('keydown', function(event) {  
    doSomething()
}, {once: true});
Run Code Online (Sandbox Code Playgroud)

一旦被调用,它就会将其删除。

removeEventListener或者,如果它是命名函数,您可以使用