7 回答
TA贡献1744条经验 获得超4个赞
这里其实 和 setTimeout 关系不大, 是onkeydown 事件的关系,
首先 你要 了解 这个事件
onkeydown 属性在用户(在键盘上)按键时触发
onkeypress 事件会在键盘按键被按下并释放一个键时发生。
onkeyup 事件会在键盘按键被松开时发生。
当用户在第一次按下键的时候 其实值是空, 你可以 onkeydown 事件中 打印下 this.value;
TA贡献1735条经验 获得超5个赞
通俗点说,
你输入的内容,并不是立刻赋值到this.value的,他存在一个栈顺序。
但用了setTimeout(fn, 0)以后,fn的代码会放到本次执行栈的最后去执行。
TA贡献1993条经验 获得超5个赞
TA贡献1789条经验 获得超10个赞
document.querySelector('#one input').onkeydown = function() {
alert('one');
document.querySelector('#one span').innerHTML = this.value;
}
document.querySelector('#second input').onkeydown = function() {
alert('second1');
setTimeout(function() {
alert('second2');
document.querySelector('#second span').innerHTML = document.querySelector('#second input').value;
}, 0);
}
中间加个alert断点就知道了
1.input在键盘按下的时候,onkeydown先执行,再有值,获取不到最后输入的值
2.input在键盘按下的时候,onkeydown也是先执行,然后触发一个异步setTimeout,值出现了之后再执行异步的setTimeout,所以能够获得最后输入的值。
onkeydown改为onkeyup就可以解决,因为onkeyup是放开按键的时候触发的,所以会先有值先执行onkeyup
添加回答
举报