首页 > 其他分享 >Vue3 项目在 H5 + ios 环境中,input 输入框在输入中文未选中汉字时会触发 chang 事件,导致输入内容与预期不符

Vue3 项目在 H5 + ios 环境中,input 输入框在输入中文未选中汉字时会触发 chang 事件,导致输入内容与预期不符

时间:2022-10-08 14:47:49浏览次数:83  
标签:const ios 验证码 value H5 input event 输入

省流版:看 解决3

环境

vue3 + vant + H5

需求

input 输入框为验证码(隐含需求:用户接收到验证码时,需要复制验证码后可以点击输入法的联想词直接输入验证码,且需要仅能输入英文及数字)

问题与解决

问题1

  • iOS 自带的输入法输入验证码的时候会重复输入两次,比如收到验证码是 qw12,点击输入后会变成 qw12qw12

解决1

  • 使用 maxlength="4" 限制

问题2

  • 需要过滤非英文及数字

解决2

  • @input 时对输入进行过滤
<van-field
  maxlength="4"
  v-model="imgCode"
  @input="onInputCode"
  placeholder="请输入图形验证码"
  autocomplete="off"
/>
const imgCode = ref(null) // 验证码

const onInputCode = ($event) => {
  loginForm.imgCode = $event.target.value.replace(/[^0-9a-zA-Z]/g, "");
};

问题3

本以为 1 && 2 组合拳下去,事情会解决,但发现使用拼音输入法,在输入法还没合成中文时会直接触发 input 事件,导致过滤后与预期不符

解决3

通过一番搜索,知道在输入合成时会有 compositionstart 事件,结束时也会有 compositionend 事件,需要在输入合成结束之后再对输入进行过滤

<van-field
  maxlength="4"
  v-model="imgCode"
  @compositionstart="onCompositionStart"
  @compositionend="onCompositionEnd"
  @input="onInputCode"
  @change="onChangeCode"
  placeholder="请输入图形验证码"
  autocomplete="off"
/>
const imgCode = ref(null) // 验证码
const codeFlag = ref(false) // 输入合成时,延迟触发过滤

const onCompositionStart = () => {
  codeFlag.value = false
}

const onCompositionEnd = () => {
  codeFlag.value = true
}

const onInputCode = ($event) => {
  setTimeout(() => {
    if (!codeFlag.value) {
      return
    }
    imgCode.value = filterCode($event.target.value)
  }, 100)
};


const onChangeCode = ($event) => {
  if (codeFlag.value) {
    return
  }
  imgCode.value = filterCode($event.target.value)
}

// 对验证码输入进行过滤,限制为仅输入数字或字母,且长度为 4 位
const filterCode = (value) => {
  return value.replace(/[^0-9a-zA-Z]/g, "").slice(0, 4);
};

参考文档

标签:const,ios,验证码,value,H5,input,event,输入
From: https://www.cnblogs.com/bpone/p/16768852.html

相关文章

  • 微信公众号H5链接防封处理
         在微信中使用相同的url短时间内打开开启,并且有分享功能的情况下,或者在部分玩家恶意举报后。该url有被微信封禁的风险。目前的处理逻辑是,在生成的url后面随机......
  • IOS充电特效SCSS实现
     效果图:   HTML代码:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><linkrel="stylesheet"href="../......
  • axios
    学习文档:https://www.jianshu.com/p/9359bf779376Promise:https://blog.csdn.net/z591102/article/details/108510315axios是基于promise管理ajax请求库安装:利用yarn安装......
  • mPaaS H5 容器知识清单 | FAQ · 第三期
    mPaaS离线包是什么?Hybrid开发模式已不是什么新鲜的话题,不仅可以快速发布新业务,同时无需考虑App发版时间,为业务更新迭代提供了极强的灵活性。相比于Web开发,Hybrid开发......
  • mPaaS H5 容器知识清单 | FAQ · 第二期
    mPaaS离线包是什么?Hybrid开发模式已不是什么新鲜的话题,不仅可以快速发布新业务,同时无需考虑App发版时间,为业务更新迭代提供了极强的灵活性。相比于Web开发,Hybrid开发......
  • mPaaS H5 容器知识清单 | FAQ · 第一期
    mPaaS离线包是什么?Hybrid开发模式已不是什么新鲜的话题,不仅可以快速发布新业务,同时无需考虑App发版时间,为业务更新迭代提供了极强的灵活性。相比于Web开发,Hybrid开发......
  • Vue阻止点击其他DOM节点失去输入框焦点
    <[email protected]="comfirm"><u-buttonsize="medium"type="primary">确定</u-button></view>mousedown事件使用capture修饰符配合prevent......
  • 一直在输入,从未有输出,是时候改变了!
    2017年9月,实验室迎新见面会,看着师兄们轮番上台展示自己的项目,心中满是敬佩,同时在心里也暗暗发力,自己也要成为一个很厉害的人。随着慢慢熟悉实验室,对实验室的几个项目组也有......
  • 从输入url到页面完成加载发生了什么(完整版)
    在写这篇文章之前本想着这个知识点涉及知识点太多太杂,找一篇大牛写的看看就算了,但是看了大概七八篇后,内心更纠结了——......
  • 前端Axios-Day44
    JSONServer:模拟服务器环境插件1.进行全局安装:npmi-gjson-server2.创建db.json文件并写入相关数据:{"posts":[{"id":1,"title":"json-server","author......