利用js生成文本框的setfocus的問題
Asp.Net的DataGrid與GridView控件確實強大,尤其是被專注於呈現數據時。而當你需要擁有完整的增刪改差功能的DataGrid時,也不是什麼難事,但如果你的客戶需要一種無刷新頁麵的實現呢?
我就碰到了這個問題,因為客戶的下屬公司訪問總部的網絡時常不穩定,每次對服務端方法的訪問都是帶有不小的網絡傳輸開銷。以至於,利用DataGird實現的增刪改差功能,每次刷新頁麵都會明顯地頓一下。這是客戶無法忍受的.......
或許這個時候,你會質疑:為什麼不將這些功能分拆成幾個頁麵來做呢?明顯效率和實現難度會大大減少。我隻能說一句,任何設計都會在客戶的需求麵前碰到難題。而這些也不是本文所討論的話題。
不妨做這樣一個實驗,新建一個文本文檔,後綴名改為.html。然後輸入以下代碼:
<html>
<script>
function setTextFocus()
{
var t1 = document.getElementById('panel');
t1.innerHTML = "<input type='text' id='text1' /><input type='text' id='text2' />";
setTimeout(function(){
t1.children[1].focus();
}, 0);
t1.children[0].focus();
}
</script>
<body >
<p ></p>
</body>
</html>
保存後,雙擊該頁麵,會發現實際獲得焦點的是後麵那個文本框,也就是說"t1.children[0].focus();"沒有起到應有的作用。而這個頁麵用FF打開,反應正常,第一個框獲得了焦點。我在這個地方鬱悶了很久,差點就要妥協了,跟客戶交待,這個要求無法實現.......
後來找到一篇比較拉風的帖子,javaeye上的,貌似發帖者是個標題黨呢?
【西方人通常發現不了的bug】https://www.javaeye.com/topic/191555
【《認識延遲時間為 0 的 setTimeout》】https://realazy.org/blog/2008/03/29/understand-0-settimeout/
原因就不在描述了,兩篇帖子已經能為你解惑了。
總結:當你在百思不得其解你的JS到底在哪裏出錯時,就嚐試在某些操作外套一個setTimeOut函數吧,IE的BUG真的不少呢。
最後更新:2017-04-02 00:06:46