javascript - 如何获取有关按下哪个键多长时间的信息?

标签 javascript events dom-events keypress

想象一下这段代码:

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

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

最佳答案

给你:

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 事件的时间戳来计算持续时间。

关于javascript - 如何获取有关按下哪个键多长时间的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6472707/

相关文章:

javascript - 使用 CasperJS 的 getElementByXPath 根据变量在页面上查找元素

javascript - 对于具有相同类的多个元素,仅影响 jquery 中单击的元素

javascript - iOS 6 - Safari - onchange 用于选择元素行为异常(更改 selectedIndex)

javascript - 如何知道浏览器是否有针对 HTML5 表单元素的特定呈现?

javascript - 使用 leaflet-react 时如何调用 fitBounds() ?

java - Vaadin:带有表事件处理的选项卡

c# - 为什么我的 WCF 客户端在调用引发事件的 WCF 服务器中的方法后超时?

javascript - 将监听器附加到 body 不起作用?

Javascript 有模拟用户交互的方法,如 .click()、.focus()、.blur()。但没有.hover()。 JS 可以模拟悬停/鼠标悬停吗?

javascript - 如何在 javascript 中迭代列表