本文详解解决价格输入框实时格式化时出现的字符截断、光标跳失及 `parseint` 解析失败问题,核心在于识别窄不换行空格(u+202f)并改用正则清洗,同时推荐使用 `blur` 事件替代 `keyup` 以保障用户体验。
在为价格输入框添加本地化格式(如法语 fr-FR 下的 "1 234" 或 "1 234")时,直接监听 keyup 并调用 toLocaleString() 看似简洁,却极易引发严重交互问题:用户连续输入 "22222" 后,输入框可能突然回退为 "2"——这并非代码逻辑错误,而是 toLocaleString('fr-FR') 默认插入的是 Unicode 窄不换行空格(U+202F),而非普通 ASCII 空格(U+0020)。而 parseInt("2 222") 在遇到首个非数字字符 U+202F 时即终止解析,仅返回 2,导致后续输入被反复覆盖。
首先,用正则 /\\D/g 全局替换所有非数字字符(\D 等价于 [^0-9]),彻底规避 Unicode 格式空格干扰:
const minPrice = document.getElementById('minPrice');
// ✅ 推荐:改用 blur 事件,在用户完成输入后格式化
minPrice.addEventListener('blur', function () {
const raw = this.value.replace(/\D/g, ''); // 清洗所有非数字字符
if (raw === '') {
this.value = '';
return;
}
const num = parseInt(raw, 10);
this.value = num.toLocaleString('fr-FR'); // 如需其他地区,可动态传入
});若必须实时反馈(如带千分位提示的输入框),推荐以下方案:
这样既保证了价格显
