JavaScript中,按键值始终比最新的落后一个字符?

19

如果我输入'St',当我按下't'键时,在onkeypress / onkeydown 函数中输出textfield.value的输入,我只能得到'S'。

这是为什么?如何消除这种延迟?

3个回答

27

使用 keyup 事件代替 keypress 事件。与 keypress 不同,keydown 事件将显示按键之前的值。


2
奇怪的是@Tom建议已经尝试过“onkeyup”? - MrWhite
3
只有在按键被释放时,keyup 事件才会触发,对于重复的按键它不会多次触发。因此,如果你一直按住某个键以输入多个相同字符,则 keyup 事件要等到按键释放后才会触发。 - Andy E

11

keypress 事件中,仍然可以防止输入的字符被注册,因此输入框的值直到 keypress 事件之后才能更新。您可以改用 keyup 事件,或使用 window.setTimeout() 设置延迟。


对于 *window.setTimeout()*,使用 0ms 的延迟足以在输入更新后立即执行代码。 - Andy E
@Andy:非常好的小技巧。在(几乎)每个浏览器中都有效吗? - Marcel Korpel
1
@Marcel:在每个浏览器中都能正常工作。我建议阅读J Resig的JavaScript计时器的工作原理,以获取更多关于该主题的详细信息。 - Andy E
Andy E:Resig的文章没有提到延迟为零的定时器。 - Tim Down
2
@Tim:不是的,但它详细介绍了计时器的工作原理(特别是排队)。一个0ms的计时器立即被添加到回调队列中是有道理的。具体来说,在总结部分中,“如果计时器被阻止立即执行,它将延迟到下一个可能的执行点”。由于单线程的特性,0ms计时器的下一个可能执行点是当线程变为空闲状态时。 - Andy E
是的,我已经阅读了这篇文章和其他一些文章。我提到它是因为我似乎记得在某个地方读到过关于setTimeout在零延迟时有不同行为的内容,尽管现在我找不到它了。 - Tim Down

1
因为按键的注册是在松开按键事件发生之后,所以你应该检测 onkeyup 事件而不是 onkeypress

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接