7

我有一个 javascript 函数,它在按下“向下”键时运行。我想,如果按住“向下”键,该功能根本不会运行。

我考虑过 keydown 和 keyup 之间的时间,如果时间小于 1 秒,那么该功能将在 keyup 上运行。问题是,如果我按住键,浏览器会将其视为连续多次按下的键。

有一个更好的方法吗?

谢谢

4

7 回答 7

10

有一个名为repeat的键盘事件属性,如果按键被按住,则返回 true。

document.addEventListener('keydown', (event) => {
  if(event.repeat) {
    // key is being held down
  } else {
    // key is being pressed
  }
});
于 2018-07-19T20:24:50.450 回答
2

我刚刚编写了这个小脚本,用于区分按下键和按下键 200 毫秒。也许你可以利用它:

document.onkeydown = function(e){
    var keycode = window.event ? window.event.keyCode : e.which;
    if(keycode == 40){
        var timer = setTimeout(function(){
            alert('Down key held');
            document.onkeyup = function(){};
        }, 200); 
        document.onkeyup = function(){
            clearTimeout(timer);
            alert('Down key pressed');   
        }
    }
};

JSFiddle

于 2011-08-23T17:11:36.893 回答
1

如果我理解您的问题是您的浏览器将一个键解释为多个 keydown 事件。如果按住某个键而不是按下它,您希望发生不同的事情;并且您希望这种差异基于您认为应该构成“持有”密钥的某个时间。因此,您需要通过跟踪 keyup 事件来区分按住和按下。下面的伪代码将解决这个问题:

按键时:

if !yourBool 
    start timer

yourBool = true 

在 Keyup 上:

if timer < yourTime
    do something

yourBool = false

这将起作用,因为除非发生 keyup 事件,否则计时器不会重新启动。

现在...如果您的浏览器将键保持解释为:
Keydown、Keyup、Keydown、Keyup.......
那么您对这种方法有疑问。

于 2011-08-23T17:09:56.417 回答
0

也许你可以在 keydown 上触发一个计数器,然后监听下一个 keyup。只要计数器超过 5 秒,或者您认为有多少时间,您就可以启动该功能。有道理?

于 2011-08-23T17:06:32.033 回答
0

连续的 keydown 不会触发 keyup,因此可以区分它们。

http://jsfiddle.net/pimvdb/xMFGQ/

$('body').keydown(function() {
    if(!$(this).data('timeDown')) { // if not pressed yet, save time
        $(this).data('timeDown', +new Date);
    }
}).keyup(function() {
    var diff = new Date - $(this).data('timeDown'); // time difference
    if(diff < 1000) { // less than one second
        alert(123);
    }
    $(this).data('timeDown', null); // reset time
});
于 2011-08-23T17:09:22.570 回答
0

浏览器看到该键被多次按下,但该keydown事件仅在第一次按下时发生。

您想要的是从keydown事件中计时,而不是keypressed.

于 2011-08-23T17:10:21.490 回答
0

我有一个类似的问题。我想捕获所有“第一个”keydown 事件,但如果它们是按下键的结果,则忽略连续事件。不确定这是否是您想要的,但这是一种方法:

var repeat = false;
el.addEventListener("keyup", function() { repeat = false; });
el.addEventListener("keydown", function() {
  if (!repeat) {
    // Run your code.
    repeat = true;
  }
});
于 2016-09-18T02:03:48.113 回答