Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript,按键值总是比最新值晚一个字符?_Javascript_Keypress_Keyboard Events_Keydown - Fatal编程技术网

Javascript,按键值总是比最新值晚一个字符?

Javascript,按键值总是比最新值晚一个字符?,javascript,keypress,keyboard-events,keydown,Javascript,Keypress,Keyboard Events,Keydown,如果我在按下t键时键入“St”,如果我在onkeypress/onkeydown函数中输出textfield.value的输入,我只得到“S” 为什么会这样?如何消除这种延迟?使用keyup事件,而不是keypresskeydown将显示击键前的值,而keypress(显然)也将显示击键前的值。因为击键直到keyup事件发生才被注册。因此,您应该在keypress事件中检测onkeypress事件,而不是onkeypress事件,仍然可以防止键入的字符注册,因此直到keypress事件之后才能更

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


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

使用
keyup
事件,而不是
keypress
keydown
将显示击键前的值,而
keypress
(显然)也将显示击键前的值。

因为击键直到keyup事件发生才被注册。因此,您应该在
keypress
事件中检测
onkeypress
事件,而不是
onkeypress

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

奇怪的是@Tom建议已经尝试过“onkeyup”?keyup只会在释放键时触发,不会因重复击键而触发。因此,如果您按住键输入多个相同的字符,则在释放键之前,keyup不会启动。+1对于window.setTimeout(),使用0毫秒的延迟足以让代码在输入更新后立即执行。@Andy:非常好的提示。(几乎)每个浏览器都能用?@Marcel:每个浏览器都能用。我建议阅读J Resig的文章,了解更多关于这个主题的细节。Andy E:Resig的文章没有提到延迟为零的计时器。@Tim:没有,但它详细介绍了计时器的工作原理(特别是排队)。有必要立即将一个0毫秒的计时器添加到回调队列中。具体来说,在recap部分,“如果计时器被阻止立即执行,它将被延迟到下一个可能的执行点”。由于单线程的特性,0ms计时器的下一个可能执行点是线程变为空闲时。