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

请求指导:基于jQuery实现指定规则的输入框自动格式化

嘿,我明白你想要的效果了——先让用户输入两位数字,自动帮他们加上前后括号,之后就能随便输入内容。之前用jQuery mask没搞定没关系,咱们不用复杂插件,用原生JS或者简单的jQuery代码就能实现,我给你写两个方案,你挑顺手的来:

方案一:原生JavaScript实现(无需依赖)

这个方案不用引入任何库,直接写在页面里就能用,逻辑清晰,兼容性也不错:

// 获取目标输入框
const input = document.getElementById('target-input');

input.addEventListener('input', function(e) {
  let value = this.value;
  // 先处理括号内的部分:提取已有的数字内容
  const bracketMatch = value.match(/^\((\d{0,2})\)/);
  
  if (bracketMatch) {
    // 已经有括号结构了
    let digits = bracketMatch[1];
    const restContent = value.slice(bracketMatch[0].length);
    
    // 如果用户删除括号里的数字,回到可输入两位数字的状态
    if (digits.length < 2) {
      // 过滤非数字字符
      digits = digits.replace(/\D/g, '');
      this.value = `(${digits})${restContent}`;
      // 保持光标在括号内的正确位置
      this.setSelectionRange(2 + digits.length, 2 + digits.length);
    } else {
      // 括号内已满两位数字,后面内容不限制,直接保留
      this.value = `(${digits})${restContent}`;
    }
  } else {
    // 还没有括号结构,先处理前两位输入
    // 过滤非数字字符
    const filtered = value.replace(/\D/g, '');
    if (filtered.length >= 2) {
      // 输入满两位,自动加上括号,后面如果有内容也保留
      this.value = `(${filtered.slice(0,2)})${filtered.slice(2)}${value.replace(/\d/g, '')}`;
      // 光标跳到括号后面
      this.setSelectionRange(5, 5);
    } else {
      // 还没满两位,只保留数字
      this.value = filtered;
    }
  }
});

使用的时候,给你的输入框加个id="target-input"就行,比如:

<input type="text" id="target-input" placeholder="先输入两位数字...">
方案二:jQuery简化实现(适合已有jQuery项目)

如果你项目里已经用了jQuery,这个写法更简洁:

$('#target-input').on('input', function() {
  let $this = $(this);
  let value = $this.val();
  const bracketMatch = value.match(/^\((\d{0,2})\)/);
  
  if (bracketMatch) {
    let digits = bracketMatch[1].replace(/\D/g, '');
    const rest = value.slice(bracketMatch[0].length);
    $this.val(`(${digits})${rest}`);
    // 处理光标位置
    const cursorPos = 2 + digits.length;
    this.setSelectionRange(cursorPos, cursorPos);
  } else {
    const filtered = value.replace(/\D/g, '');
    if (filtered.length >= 2) {
      $this.val(`(${filtered.slice(0,2)})${filtered.slice(2)}${value.replace(/\d/g, '')}`);
      this.setSelectionRange(5, 5);
    } else {
      $this.val(filtered);
    }
  }
});
额外说明
  • 这两个方案都处理了光标位置,用户输入或删除时不会出现光标乱跑的情况,体验更流畅
  • 如果用户尝试在括号内输入非数字,会自动过滤掉,保证括号里只有两位数字
  • 当括号里的数字被删到少于两位时,会回到可输入数字的状态,删完的话就重新开始输入两位数字

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:55:59