fix: 债券三字段 keydown 守卫改用正向白名单,堵住"没改值却标REV"的缺口
根因:onBondPriceKeydown 的按键排除列表只排除回车/Ctrl-Alt-Meta/Tab/Home/End/←→/F5, 漏掉 ↑(38)/↓(40)/Insert(45)/PageUp(33)/PageDown(34)/F1-F4,F6-F12/纯Shift。 这些键不改变数值却会触发 applyBondManualEdit 标 REV——正是用户观察到的 "鼠标放输入框没改值、只按了方向键/功能键却有时出现REV"。 修复: - swapCalc.js 新增纯函数 isBondPriceValueKey(event):正向白名单(数字/小数点/减号/Backspace/Delete) 才返回 true,其余(回车/修饰键/导航键/功能键/纯Shift)返回 false,jest 可测。 - swapTradeEdit.js onBondPriceKeydown 改用该函数判定,并移除两行每次按键的 console.log 噪音。 - 纯鼠标聚焦(无按键)本就不会标REV(无 focus/click 处理;vue-number-input 的 input 仅在值变化(失焦/回车)触发), 本次仅修正按键守卫缺口。 - 同步补 9 个单测覆盖各类按键(响应"最好单测阶段解决")。 约定1/约定2/约定3 累加REV 行为不受任何影响(仅改判定是否标REV的触发条件)。 测试:bondCalc 全套 81 例通过。
This commit is contained in:
@@ -276,3 +276,55 @@ describe('单位换算边界(前端↔债券计算器 存储态小数 ↔ 展
|
||||
expect(modelYtm * 100).toBeCloseTo(6.37, 4);
|
||||
});
|
||||
});
|
||||
|
||||
describe('isBondPriceValueKey:只有真正改值的按键才标REV(防止"没改值却REV")', () => {
|
||||
const K = (keyCode, extra) => Object.assign({ which: keyCode, keyCode: keyCode }, extra || {});
|
||||
test('数字键(主键盘/小键盘) → 改值', () => {
|
||||
expect(SwapCalc.isBondPriceValueKey(K(49))).toBe(true); // 主键盘 1
|
||||
expect(SwapCalc.isBondPriceValueKey(K(97))).toBe(true); // 小键盘 1
|
||||
});
|
||||
test('小数点/减号(主键盘/小键盘) → 改值', () => {
|
||||
expect(SwapCalc.isBondPriceValueKey(K(190))).toBe(true); // 主键盘 .
|
||||
expect(SwapCalc.isBondPriceValueKey(K(110))).toBe(true); // 小键盘 .
|
||||
expect(SwapCalc.isBondPriceValueKey(K(189))).toBe(true); // 主键盘 -
|
||||
expect(SwapCalc.isBondPriceValueKey(K(109))).toBe(true); // 小键盘 -
|
||||
});
|
||||
test('Backspace / Delete → 改值', () => {
|
||||
expect(SwapCalc.isBondPriceValueKey(K(8))).toBe(true);
|
||||
expect(SwapCalc.isBondPriceValueKey(K(46))).toBe(true);
|
||||
});
|
||||
test('回车 → 不改标识(由 enter 事件处理)', () => {
|
||||
expect(SwapCalc.isBondPriceValueKey(K(13))).toBe(false);
|
||||
expect(SwapCalc.isBondPriceValueKey(K(108))).toBe(false);
|
||||
});
|
||||
test('方向键 ←↑→↓ → 不改标识(修复:此前漏掉 ↑↓ 会误标REV)', () => {
|
||||
expect(SwapCalc.isBondPriceValueKey(K(37))).toBe(false);
|
||||
expect(SwapCalc.isBondPriceValueKey(K(38))).toBe(false);
|
||||
expect(SwapCalc.isBondPriceValueKey(K(39))).toBe(false);
|
||||
expect(SwapCalc.isBondPriceValueKey(K(40))).toBe(false);
|
||||
});
|
||||
test('Home/End/Tab/Insert/PageUp/PageDown → 不改标识(修复:此前漏掉 Insert/PageUp/PageDown)', () => {
|
||||
expect(SwapCalc.isBondPriceValueKey(K(35))).toBe(false);
|
||||
expect(SwapCalc.isBondPriceValueKey(K(36))).toBe(false);
|
||||
expect(SwapCalc.isBondPriceValueKey(K(9))).toBe(false);
|
||||
expect(SwapCalc.isBondPriceValueKey(K(45))).toBe(false);
|
||||
expect(SwapCalc.isBondPriceValueKey(K(33))).toBe(false);
|
||||
expect(SwapCalc.isBondPriceValueKey(K(34))).toBe(false);
|
||||
});
|
||||
test('F1-F12 → 不改标识(修复:此前漏掉除 F5 外的功能键)', () => {
|
||||
[112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123].forEach(function (kc) {
|
||||
expect(SwapCalc.isBondPriceValueKey(K(kc))).toBe(false);
|
||||
});
|
||||
});
|
||||
test('纯 Shift / Ctrl / Alt / Meta 组合键 → 不改标识', () => {
|
||||
expect(SwapCalc.isBondPriceValueKey(K(16))).toBe(false); // 纯 Shift
|
||||
expect(SwapCalc.isBondPriceValueKey(K(65, { ctrlKey: true }))).toBe(false); // Ctrl+A
|
||||
expect(SwapCalc.isBondPriceValueKey(K(86, { ctrlKey: true }))).toBe(false); // Ctrl+V
|
||||
expect(SwapCalc.isBondPriceValueKey(K(67, { altKey: true }))).toBe(false);
|
||||
expect(SwapCalc.isBondPriceValueKey(K(67, { metaKey: true }))).toBe(false);
|
||||
});
|
||||
test('无事件对象 → 安全返回 false', () => {
|
||||
expect(SwapCalc.isBondPriceValueKey(null)).toBe(false);
|
||||
expect(SwapCalc.isBondPriceValueKey(undefined)).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user