【问题标题】:How to get info on what key was pressed on for how long?如何获取有关按了多长时间的键的信息?
【发布时间】:2011-09-22 07:06:54
【问题描述】:

想象一下这段代码:

if (navigator.appName == "Opera")
    document.onkeypress = function (e) { console.log(e.keyCode); };
else 
    document.onkeydown = function (e) { console.log(e.keyCode); };

我猜它的作用很明显。问题是,如果您长时间持有密钥,它将被注册很多次。在我的应用程序中,这是一个问题,因为它使我的应用程序进行了大量不必要的计算。是否有可能以某种方式只获得一次keypress,但提供有关密钥持有时间的信息?

【问题讨论】:

  • 我不是逻辑或任何方面的专家,但 if 语句的分支不应该有所不同吗? :)
  • 你使用像 jQuery 这样的库吗?
  • 哎呀,是的,你是对的,当然它们应该不同 %) 不,我不使用 jQuery 或任何其他框架。

标签: javascript events dom-events keypress


【解决方案1】:

给你:

var pressed = {};

window.onkeydown = function(e) {
    if ( pressed[e.which] ) return;
    pressed[e.which] = e.timeStamp;
};

window.onkeyup = function(e) {
    if ( !pressed[e.which] ) return;
    var duration = ( e.timeStamp - pressed[e.which] ) / 1000;
    // Key "e.which" was pressed for "duration" seconds
    pressed[e.which] = 0;
};

现场演示: http://jsfiddle.net/EeXVX/1/show/

(去掉URL中的“show/”部分即可查看演示代码)

所以你有 pressed 对象,它监视当前正在按下哪些键以及它们被按下的时间点(时间)。

在 keyup 处理程序中,您确定是否按下了键,如果是,则通过减去 keyup/keydown 事件的时间戳来计算持续时间。

【讨论】:

  • @popoffka 请注意,此代码不适用于 Opera 和旧版本的 IE(IE8 及以下)...
【解决方案2】:

你有没有尝试过类似的事情,

  1. onkeydown,移除 keydown 监听器。
  2. onkeyup,再次附加 keydown 监听器并计算时间?

【讨论】:

  • 当然,您还必须考虑其他可能性。就像 onkeyup 从未被触发一样。
  • 这不适用于并行按键(同时按下多个键)。
猜你喜欢
  • 2013-12-22
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
相关资源
最近更新 更多