SSN验证输入框Ctrl+A全选删除、del删除按键功能失效问题求助
问题成因
- 核心问题出在
keypress事件的拦截逻辑:该事件仅对可打印字符触发有效输入,Delete、Backspace、方向键、Ctrl/Command 组合键这类功能按键触发keypress时,String.fromCharCode(event.which)无法拿到符合规则的有效字符,原代码直接对所有不符合整数规则的输入返回false,等于把删除、全选这类功能操作直接拦截了。 isInteger校验没有做功能按键豁免逻辑,所有非数字/-的输入都会被判定为无效,进一步加剧了功能按键被拦截的问题。
解决方案
修改keypress的监听逻辑,优先放行功能按键,只对可打印字符做输入校验即可,修改后完整代码如下:
// SSN validation // trap keypress - only allow numbers $('input.ssn').on('keypress', function(event){ // 豁免功能按键:退格、删除、方向键、Ctrl/Command组合键 const allowedKeyCodes = [8, 46, 37, 38, 39, 40]; if (allowedKeyCodes.includes(event.which) || event.ctrlKey || event.metaKey) { return true; } // 仅校验可打印输入字符 var character = String.fromCharCode(event.which); if(!isInteger(character)){ return false; } }); // checks that an input string is an integer, with an optional +/- sign character function isInteger (s) { if(s === '-') return true; var isInteger_re = /^\s*(\+|-)?\d+\s*$/; return String(s).search (isInteger_re) != -1 } // format SSN $('input.ssn').on('keyup', function(){ var val = this.value.replace(/\D/g, ''); var newVal = ''; if(val.length > 4) { this.value = val; } if((val.length > 3) && (val.length < 6)) { newVal += val.substr(0, 3) + '-'; val = val.substr(3); } if (val.length > 5) { newVal += val.substr(0, 3) + '-'; newVal += val.substr(3, 2) + '-'; val = val.substr(5); } newVal += val; this.value = newVal; });
修改说明:
- 新增功能按键豁免规则,退格(键码8)、删除(键码46)、上下左右方向键(键码37-40)、Ctrl/Command触发的组合操作(全选、复制、粘贴等)都会直接放行,不会被输入校验拦截。
- 仅对正常输入的可打印字符做整数校验,既保证输入内容仅为合法数字,也不影响正常的编辑操作。
内容的提问来源于stack exchange,提问作者Jon
相关产品推荐
相关产品推荐

