You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

移动端响应式下input绑定keyup实现千位分隔符时字符重复报错如何解决

移动端输入框千位分隔符异常修复方案

问题根因

  • 移动端软键盘触发keyup事件时,event.which固定返回0,原有方向键拦截逻辑完全失效
  • keyup事件无法覆盖移动端粘贴、自动补全、联想输入等场景的输入值变更,会出现值重复拼接的问题
  • 移动端部分输入法会在输入过程中插入临时字符,原有正则替换逻辑处理时会出现误判

修复方案

换用H5标准input事件替代keyup,input事件会在输入值发生任何变更时触发,兼容全端所有输入场景,同时补充光标位置修复逻辑,避免输入时光标自动跳转到末尾的体验问题。

修复后完整代码

HTML代码

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="number">

JS代码

$('input.number').on('input', function(event) {
  // 保存当前光标位置
  const cursorPos = this.selectionStart;
  // 统计替换前光标前的逗号数量,用于后续修正光标偏移
  const prevCommaCount = (this.value.slice(0, cursorPos).match(/,/g) || []).length;

  $(this).val(function(index, value) {
    // 过滤所有非数字字符
    const pureNumber = value.replace(/\D/g, '');
    if (!pureNumber) return '';
    // 生成带千位分隔符的结果
    return pureNumber.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  });

  // 修正替换后的光标位置
  const newCommaCount = (this.value.slice(0, cursorPos).match(/,/g) || []).length;
  const newCursorPos = cursorPos + (newCommaCount - prevCommaCount);
  this.setSelectionRange(newCursorPos, newCursorPos);
});

验证效果

  • 桌面端、Android、iOS移动端输入1000000都会正确显示为1,000,000,不会出现数字重复拼接的问题
  • 支持修改中间位数字、粘贴数字等操作,光标不会自动跳转至末尾
  • 兼容所有主流输入法的联想输入、自动补全场景

内容的提问来源于stack exchange,提问作者nhadatsonnghia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 07:45:03