在開發WebFrom時利用 DropDownList的情況,這個控制項在開啟AutoPostBack時,可以使Client端在選取變更內容時觸發PostBack。不過有一個問題,就是當Client點擊瀏覽器上一頁後,會造成DropDownList選取內容沒有跟著回到上一個狀態。
目前正常輸出畫面如下圖:
選取C選項後:
問題情況,當點選瀏覽器上一頁後,會呈現下面這個畫面 :
可以發現很奇特的狀況,瀏覽器呈現的畫面和HTML不相符。如果有利用此控制項選取值來抓取資料的話則會產生異常狀況。
而導致此現象的原因應該是和 onchange="javascript:setTimeout('__doPostBack(\'DDL1\',\'\')', 0)" 這一段有關。這段是控制項為了達到PostBack效果而產生的JavaScript程式碼,目的是在Client變更Select選項後Submit到Server端。
原因解析:
瀏覽器點選上一頁後,將從Cache中回復之前瀏覽狀態,顯示畫面和HTML都是選取A的狀態(可以在瀏覽器Debug中,發現window.onload結束前都是A沒有問題)。但是瀏覽器還會回復Submit前的最後一步驟,也就是Client端 變更Select選項成C這段(可以發現在window.onload結束後,畫面上的值會瞬間變成C),所以最後才會造成如此現象。
處理方式:
既然資料不會回到Server端,那麼只好用JavaScript在Client端把這問題修正回來。
程式碼如下:
<script type="text/javascript">
//在window.onload結束前紀錄原本選項
let ValTemp = document.getElementById("DDL1").selectedIndex;
//利用setTimeout在window.onload結束後,將Select調整回原本的選項
window.addEventListener("load", function () {
setTimeout(function() {document.getElementById("DDL1").selectedIndex = 0;document.getElementById("DDL1").selectedIndex = ValTemp}, 0);
}, true)
</script>
沒有留言:
張貼留言