jQuery UI Datepicker 在滚动后定位异常的解决方案
2025-05-20 11:04:00作者:管翌锬
问题背景
在使用jQuery UI 1.13.2和jQuery 3.7.1版本时,开发者发现当页面滚动后,在Bootstrap模态框中打开的Datepicker组件会出现定位异常的问题。具体表现为Datepicker弹出窗口不会正确显示在输入框下方,而是出现在错误的位置。
问题分析
这个问题源于jQuery UI Datepicker组件内部计算偏移量的逻辑存在缺陷。当页面发生滚动且Datepicker在固定定位的模态框中打开时,原始的_checkOffset
方法没有正确处理滚动偏移量,导致定位计算错误。
解决方案
通过重写Datepicker的_checkOffset
方法可以解决这个问题。以下是完整的解决方案实现:
$(document).ready(function () {
setTimeout(function () {
// 重写_checkOffset函数
$.datepicker._checkOffset = function (inst, offset, isFixed) {
var dpWidth = inst.dpDiv.outerWidth(),
dpHeight = inst.dpDiv.outerHeight(),
inputWidth = inst.input ? inst.input.outerWidth() : 0,
inputHeight = inst.input ? inst.input.outerHeight() : 0,
viewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),
viewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());
offset.left -= (this._get(inst, "isRTL") ? (dpWidth - inputWidth) : 0);
offset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;
// 关键修改:正确处理滚动偏移量
offset.top -= (isFixed && ($(document).scrollTop() > 0)) ? $(document).scrollTop() : 0;
// 检查Datepicker是否超出视口范围,如果是则调整位置
offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?
Math.abs(offset.left + dpWidth - viewWidth) : 0);
offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?
Math.abs(dpHeight + inputHeight) : 0);
return offset;
};
}, 100);
});
实现说明
-
延迟执行:使用
setTimeout
确保代码在Datepicker组件加载完成后执行,避免覆盖失败。 -
关键修改点:
- 原始代码仅当offset.top等于输入框底部位置时才减去滚动偏移量
- 修改后的代码在任何滚动情况下都会正确处理滚动偏移量
-
范围检查:保留原始方法中对视口范围的检查逻辑,确保Datepicker不会显示在可视区域之外。
-
RTL支持:保留对从右到左布局的支持。
部署建议
- 将
登录后查看全文
热门项目推荐
相关项目推荐
热门内容推荐
最新内容推荐
项目优选
收起

🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
51
14

本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
275
490

🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
449
369

React Native鸿蒙化仓库
C++
98
181

openGauss kernel ~ openGauss is an open source relational database management system
C++
52
121

旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
88
245

前端智能化场景解决方案UI库,轻松构建你的AI应用,我们将持续完善更新,欢迎你的使用与建议。
官网地址:https://matechat.gitcode.com
649
77

🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
350
34

方舟分析器:面向ArkTS语言的静态程序分析框架
TypeScript
29
37

插件化、定制化、无广告的免费音乐播放器
TSX
38
2