閱讀651 返回首頁    go 微軟 go Office


利用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上的,貌似發帖者是個標題黨呢?

    【西方人通常發現不了的bughttps://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

  上一篇:go DataGrid模板列的CheckBox事件定義方法
  下一篇:go php中調用其他係統http接口的方法