目标是手动设置按住键的“重复率”。
例如,当在文本框中按住 X 键时,我知道存在 特定于浏览器的重复按下字符的方法。在某些情况下,它会暂停,然后连续触发按下的键。在其他情况下,它根本不会重复。我想通过强制按特定时间间隔重复按下的键来缓解这种情况,而不管浏览器如何。
通过研究,我想出了一个基于定时器的尝试,但是在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
} );
我可能把这整件事搞砸了……我试图重新创建 这个 SO post 的简化版本。但是,我觉得必须 有 更好的方法来做到这一点。有什么想法吗?
更新:
我们可以假设最终用户没有将他们的操作系统键盘重复率设置为大于我想要使用的速率 (1000ms)。如果是,那么它应该回落到它们的重复率,因为它不会一直触发按键事件。如果不是(更有可能因为大多数人不修改它),那么我们将覆盖该行为以使其延迟我们指定的时间段。
原文由 Jeff Jenkins 发布,翻译遵循 CC BY-SA 4.0 许可协议
好吧,我想通了为什么我的例子没有循环。在 keydown 循环中,它在超时之前清除超时:
超时只有在超时后才应该被清除,所以需要将
if
条件移到超时函数中:如果有人可以对此进行改进或提供更好的选择,我将保留此赏金。