JavaScript 中从 DOM 属性(如 data-*)获取的值默认是字符串,直接用 比较会导致字典序比较(如 "11"javascript 中从 dom 属性(如 `data-*`)获取的值默认是字符串,直接用 `` 比较会导致字典序比较(如 `"11"
你遇到的问题根源在于:HTML 自定义属性(如 data-maxed、data-cap)返回的始终是字符串类型,而非数值。你的代码中:
var getMaxApplied = $("##mainform1").find('option:selected').attr('data-maxed'); // → "11.00"(字符串) var capLimit = $("##mainform1").find('option:selected').attr('data-cap'); // → "Y"(字符串) var appliedLeaves = $("##mainform1").find("##TotalDays_id").val(); // → "8" 或 "30"(字符串)当执行 appliedLeaves > getMaxApplied(例如 "8" > "11.00")时,JavaScript 并非按数值大小比较,而是按字符串字典序(lexicographic order)逐字符比较:
- "8" vs "11.00":首字符 '8' > '1' → "8" > "11.00" 为 true ✅
- "11" > "8":首字符 '1' "8" 为 false ❌(但你预期应为 true)
这正是“为什么 11 天反而被判定小于 8 天”的根本原因。
✅ 正确做法:在比较前强制转换为数字类型。推荐使用一元加号 + 操作符(简洁、对空字符串/无效值返回 NaN,便于后续校验):
var getMaxApplied = +$("##mainform1").find('option:selected').attr('data-maxed'); // → 11.00(number) var capLimit = $("##mainform1").find('option:selected').attr('data-cap'); // 字符串,无需转数字 var appliedLeaves = +$("##mainform1").find("##TotalDays_id").val(); // → 8 或 30(number) // 同时建议增加基础校验,避免 NaN 导致逻辑失效 if (isNaN(getMaxApplied) || isNaN(appliedLeaves)) { alert('数据格式错误:请检查 data-maxed 或输入天数是否为有效数字'); return false; } if (getMaxApplied !== 0 && appliedLeaves getMaxApplied && capLimit === "Y") { alert('The requested leaves are greater than the cap limit.'); ok = false; } return ok;⚠️ 注意事项:
- 不要使用 parseInt()(会截断小数,如 "11.5" → 11)或 parseFloat()(虽保留小数但略冗长);+str 是最简健壮的数值转换方式;
- 严格相等 === 替代 ==,避免隐式类型转换引入新问题;
- jQuery 选择器中 ##mainform1 应为 #mainform1(ID 选择器是单个 #),多写一个 # 可能导致选择失败,需同步修正;
- data-cap="Y"/"N" 是字符串,保持 === "Y" 判断即可,无需转布尔。
总结:永远不要信任 DOM 属性值的类型——显式转换是安全编码的铁律。 一次类型转换,可避免无数难以调试的“诡异弹窗”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











