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

iPhone「来自信息」快捷粘贴OTP到6格输入框无法触发捕获事件如何解决

iOS 短信OTP快捷填充多输入框适配方案

问题根因

iOS 系统级的短信OTP快捷填充不属于常规的用户粘贴/键盘输入行为,不会触发paste、keyup、keypress、change这类交互事件,仅会触发标准的input事件,这是之前的监听逻辑失效的核心原因。

适配方案(无需更换为单输入框)

方案1:监听input事件处理完整OTP内容

iOS 自动填充时会将完整的OTP字符串写入当前聚焦的输入框,即使输入框设置了maxlength="1",在input事件触发的瞬间仍然可以读取到完整的未截断内容,你可以直接复用之前写的OTP拆分填充逻辑:

// 获取所有6位OTP输入框
const otpInputs = document.querySelectorAll('.otp-input');

// 给所有输入框绑定input事件,适配用户聚焦任意输入框触发填充的场景
otpInputs.forEach(input => {
  input.addEventListener('input', (e) => {
    const inputValue = e.target.value.trim();
    // 匹配6位数字的OTP格式
    if (/^\d{6}$/.test(inputValue)) {
      // 逐位填充到对应输入框
      inputValue.split('').forEach((digit, idx) => {
        if (otpInputs[idx]) otpInputs[idx].value = digit;
      });
      // 焦点跳转到最后一位输入框
      otpInputs[otpInputs.length - 1].focus();
      e.preventDefault();
    }
  });
});

方案2:添加标准OTP填充属性

给所有OTP输入框添加autocomplete="one-time-code"属性,这是W3C标准定义的一次性验证码专属属性,iOS Safari 12及以上版本会自动识别连续的同属性输入组,部分系统版本会直接自动逐位填充到多个输入框中,无需额外逻辑:

<input type="text" class="otp-input" maxlength="1" autocomplete="one-time-code" inputmode="numeric">
<input type="text" class="otp-input" maxlength="1" autocomplete="one-time-code" inputmode="numeric">
<input type="text" class="otp-input" maxlength="1" autocomplete="one-time-code" inputmode="numeric">
<input type="text" class="otp-input" maxlength="1" autocomplete="one-time-code" inputmode="numeric">
<input type="text" class="otp-input" maxlength="1" autocomplete="one-time-code" inputmode="numeric">
<input type="text" class="otp-input" maxlength="1" autocomplete="one-time-code" inputmode="numeric">

兜底兼容建议

如果部分旧版本iOS系统存在input事件触发异常,可以额外监听beforeinput事件作为兜底,该事件会在内容插入到输入框之前触发,可通过e.data拿到完整的填充内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:36:04