7 回答

TA貢獻1744條經驗 獲得超4個贊
這里其實 和 setTimeout 關系不大, 是onkeydown 事件的關系,
首先 你要 了解 這個事件
onkeydown 屬性在用戶(在鍵盤上)按鍵時觸發
onkeypress 事件會在鍵盤按鍵被按下并釋放一個鍵時發生。
onkeyup 事件會在鍵盤按鍵被松開時發生。
當用戶在第一次按下鍵的時候 其實值是空, 你可以 onkeydown 事件中 打印下 this.value;

TA貢獻1735條經驗 獲得超5個贊
通俗點說,
你輸入的內容,并不是立刻賦值到this.value的,他存在一個棧順序。
但用了setTimeout(fn, 0)以后,fn的代碼會放到本次執行棧的最后去執行。

TA貢獻1993條經驗 獲得超6個贊

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
添加回答
舉報