本文解决 jquery 实现的顶部同步滚动条在浏览器窗口缩放至 90% 以下时失灵的问题,核心原因是重复绑定 scroll 事件导致冲突,需在每次重绑前调用 `.off('scroll')` 清理旧监听器。
在 ASP.NET WebForms 中使用 jQuery 模拟顶部水平滚动条(与底部 GridView 同步)时,常见做法是通过 $(window).resize() 触发 TopScrollBar() 函数,动态调整顶部滚动容器宽度并绑定双向 scroll 事件。但原代码存在一个关键缺陷:每次窗口缩放都会调用 .on('scroll', ...) 而未解绑先前绑定的事件处理器,导致事件监听器不断累积。
当浏览器缩放到 90% 以下(尤其在高 DPI 或缩放渲染模式下),DOM 尺寸计算可能触发多次 resize 回调,叠加大量重复 scroll 监听器。这不仅造成性能下降,更会引发事件执行顺序混乱、scrollLeft 同步错位,甚至因 jQuery 内部事件队列异常而导致滚动行为“看似失效”。
✅ 正确做法是在每次绑定前显式

function TopScrollBar() {
// 同步顶部 divWidth 宽度(确保与 GridView1 实际渲染宽度一致)
const gridWidth = $('#GridView1').outerWidth(true);
$('#divWidth').width(gridWidth);
// 关键修复:先 off 再 on,避免重复绑定
$("#divScroll").off('scroll').on('scroll', function () {
$("#GridContainer").scrollLeft($(this).scrollLeft());
});
$("#GridContainer").off('scroll').on('scroll', function () {
$("#divScroll").scrollLeft($(this).scrollLeft());
});
}⚠️ 补充注意事项: