blur 事件中直接 focus() 會導致瀏覽器事件循環衝突,焦點無法生效。
$("#tmpName").blur(function() {
var val = $.trim($(this).val());
if (val.length === 0) {
setTimeout(function() { // 關鍵:延時到下一事件循環
$("#tmpName").focus();
}, 10);
}
}).focus(); // 頁面加載自動聚焦
blur 觸發時,瀏覽器正處理焦點轉移流程,立即調用 focus() 會被忽略或導致遞歸。setTimeout(fn, 0/10) 將 focus() 推到下一個宏任務隊列,待當前事件處理完畢再執行,繞過衝突。同理適用於 alert、confirm 等阻塞 UI 的操作後強制聚焦。