`UpdatePanel` 部分更新導致頁面重繪,捲軸位置重置為頂部。解法:`onscroll` 記錄 `scrollTop` 至 `HiddenField`,`PageRequestManager` 的 `pageLoaded` 事件恢復。
<div id="scrollArea" style="height:455px;overflow:auto" onscroll="saveScroll(this)">
<!-- 列表內容 -->
</div>
<asp:HiddenField ID="hfScroll" runat="server" />
<script>
function saveScroll(el) {
$get('<%= hfScroll.ClientID %>').value = el.scrollTop;
}
var prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_pageLoaded(function() {
var area = $get("scrollArea");
var val = $get('<%= hfScroll.ClientID %>').value;
if (area && val) area.scrollTop = parseInt(val, 10);
});
</script>
<asp:HiddenField ID="hfGlobalScroll" runat="server" />
<script>
// 記錄:格式 "控件ID|scrollTop"
function saveScroll(el) {
var hf = $get('<%= hfGlobalScroll.ClientID %>');
if (hf) hf.value = el.id + "|" + el.scrollTop;
}
// 恢復
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(function() {
var hf = $get('<%= hfGlobalScroll.ClientID %>');
if (!hf || !hf.value) return;
var parts = hf.value.split("|");
if (parts.length === 2) {
var target = $get(parts[0]);
var top = parseInt(parts[1], 10);
if (target && !isNaN(top)) target.scrollTop = top;
}
});
</script>
使用時:任意可捲動容器加上 `id` 與 `onscroll="saveScroll(this)"` 即可。