【发布时间】:2012-07-06 12:32:22
【问题描述】:
目标是手动设置保持键的“重复率”。
例如,当在文本框中按住 X 键时,我知道有browser-specific ways of repeating the pressed character。在某些情况下,它会暂停,然后连续触发按下的键。在其他情况下,它根本不会重复。我想通过强制按下的键以特定间隔重复来缓解这种情况,而不管浏览器如何。
通过研究,我想出了一个基于计时器的尝试,但在 Safari 中,它不会重复字符。我有一个菜单系统,其中按住箭头滚动列表,但翻译动画和重复率彼此不喜欢。
var repeating = false;
var repeatRateTimer = null;
$( document ).bind( 'keyup', function( input ) {
if( repeatRateTimer != null )
{
clearTimeout( repeatRateTimer );
repeatRateTimer = null;
}
repeating = false;
} );
$( document ).bind( 'keydown', function( input ) {
input.preventDefault( );
if( repeating == true )
{
if( repeatRateTimer != null )
{
clearTimeout( repeatRateTimer );
repeatRateTimer = null;
}
else
{
repeatRateTimer = setTimeout( function( ){ repeating = false; }, 1000 );
}
return;
}
repeating = true;
// ...keyboard logic
} );
我可能把整个事情搞砸了……我试图重新创建一个简化版的this SO post。但是,我觉得必须有更好的方法来做到这一点。有什么想法吗?
更新:
我们可以假设最终用户没有将他们的操作系统键盘重复率设置为大于我想要使用的频率(1000 毫秒)。如果是,那么它应该回退到它们的重复率,因为它不会继续触发按键事件。如果不是(更有可能,因为大多数人不修改它),那么我们将覆盖该行为以使其延迟我们指定的时期。
【问题讨论】:
-
重复率不是操作系统设置的吗? (例如,在 Windows 中,这可以通过控制面板/键盘属性进行设置。)所以用户不希望按键以这种速率重复吗? (你有两次 keyup 而不是 keyup 和 keydown 的问题只是一个错字吗?)
-
Correct,它是特定于浏览器/操作系统的。我正在尝试创建一致性,特别是对于我的应用程序,我想手动设置它重复的速率。另外,感谢@nnnnnn 对错字的提醒。
-
您是否有理由不使用您引用的SO post 中的代码?
-
@JefferyTo 主要原因是因为我想自己编写它,这样我可以更好地理解它并且能够随着我的应用程序的增长进行修改,而不依赖于别人的想法。这是一种个人偏好,源于需要了解事物为什么以及如何工作的需要。我也没有那种“是的!我明白了!”的感觉。当我只是把别人的代码放进去时。我会参考别人的想法和方向,但我不会公然抄袭别人的逻辑,尤其是当它不是专门为我的应用程序设计的时候。
-
@MrSlayer - 实际上我确实使用计时器。然而,与
setInterval函数不同,我的Delta Timer 触发更准确。因此,您期望的 1000 毫秒间隔始终保持不变。此外,我的代码会为同时按下的不同键触发多个事件。它们都保持恒定的间隔。上次我检查它能够处理同时按下的四个键。但是,该数字是特定于操作系统的。我相信能够同时处理 4 个按键对于任何应用程序来说都足够了。您不希望用户向密钥发送垃圾邮件。
标签: javascript jquery keypress keydown repeat