vue 输入电话号码自动按3-4-4分割功能的实现代码


Posted in Javascript onApril 30, 2020

输入框绑定

<input class="inputBox" type="phone" 
placeholder=" 请输入手机号" 
maxlength="13" v-model="phoneNum"/>

监听事件,每次号码发生改变时触发
大体的逻辑是:先比较号码变化前后的长度,判断是输入还是删除,如果是输入的话,利用正则表达式改变号码格式。

watch: {
 phoneNum (newValue, oldValue) { // 监听电话号码
 this.phoneNum = newValue.length > oldValue.length ? newValue.replace(/\s/g, '').replace(/(\d{3})(\d{0,4})(\d{0,4})/, '$1 $2 $3') : this.phoneNum.trim()
 if (this.phoneNum.length === 13) {
 // 验证/保存的手机号码,去除空格
 this.state.checkPhoneNum = this.phoneNum.replace(/\s/g, '')
 console.log('输入的电话号码是:', this.state.checkPhoneNum)
 } 
 }
 },

效果示意

vue 输入电话号码自动按3-4-4分割功能的实现代码

附录:下面看下vue手机号按344分隔,银行卡号每4位空格分隔

实现效果:

1. 手机号输入/粘贴时,不允许输入数字外的其它字符,按344分隔,最大输入11位数字

2. 银行卡号输入/粘贴时,不允许输入数字外的其它字符,每四位用空格分隔

vue 输入电话号码自动按3-4-4分割功能的实现代码

代码:

<template>
 <div class="form">
 <p>
 手机号:
 <input v-model="mobile" type="tel" ref="mobile" maxlength="13" @keyup="inputMobile" @paste="inputMobile" />
 </p>
 <p>
 银行卡号:
 <input v-model="card" type="text" @keyup="inputCard" @paste="inputCard" />
 </p>
 </div>
</template>

js:

<script>
 export default {
 data() {
 return {
 mobile: '',
 card: ''
 }
 },
 methods: {
 inputMobile() {
 let value = this.mobile.replace(/\D/g, '').substr(0, 11) // 不允许输入非数字字符,超过11位数字截取前11位
 let len = value.length
 if (len > 3 && len < 8) {
  value = value.replace(/^(\d{3})/g, '$1 ')
 } else if (len >= 8) {
  value = value.replace(/^(\d{3})(\d{4})/g, '$1 $2 ')
 }
 this.mobile = value
 },
 inputCard() {
 this.card = this.card.replace(/\D/g, '') // 不允许输入非数字字符
 this.card = this.card.replace(/(\d{4})(?=\d)/g, '$1 ') // 4位一组,非获取匹配最后一组数字,避免删除到空格时会马上自动补齐
 }
 }
 } 
</script>

上述方案即可实现基本效果,但如果从中间开始删除或添加内容时,光标会自动跑到最后,如下:

vue 输入电话号码自动按3-4-4分割功能的实现代码

若想光标留在删除/添加内容位置,需要设置光标位置:

vue 输入电话号码自动按3-4-4分割功能的实现代码

修改js如下:

<script>
 export default {
 data () {
 return {
 mobile: '',
 card: ''
 }
 },
 methods: {
 inputMobile (e) {
 this.formatMobile(e)
 this.mobile = this.$refs.mobile.value
 },
 formatMobile (e) {
 let val = this.$refs.mobile.value // 不可直接用this.mobile,第一方便提取该方法降低代码耦合度,第二直接用this.mobile,在输入汉字时按下shift按键会导致无法再输入和删除内容
 let selStart = this.$refs.mobile.selectionStart // 选中区域左边界位置
 let mobileLen = val.length
 let value = this.getValue(e, val).substr(0, 11) // 获取输入/粘贴内容,并截取前11位
 let len = value.length
 if (len > 3 && len < 8) {
  value = value.replace(/^(\d{3})/g, '$1 ')
 } else if (len >= 8) {
  value = value.replace(/^(\d{3})(\d{4})/g, '$1 $2 ')
 }
 this.$refs.mobile.value = value
 if (selStart !== mobileLen) {
  if (selStart === 3) {
  selStart++
  }
  // 设置光标位置
  this.$refs.mobile.selectionStart = this.$refs.mobile.selectionEnd = selStart
 }
 },
 getValue(e, val) {
 let value = ''
 if (e.type === 'keyup') {
  value = val.replace(/\D/g, '')
 } else if (e.type === 'paste') {
  // window.clipboardData:IE浏览器获取剪贴板数据对象
  // event.clipboardData:Chrome, Firefox, Safari获取剪贴板数据对象
  let clipboardData = event.clipboardData || window.clipboardData;
  value = clipboardData.getData('Text'); // 获取剪贴板text格式的数据
  value = value.replace(/\D/g, '')
 }
 return value
 }
 }
 }
</script>

未实现:

不允许粘贴非数字内容到输入框还未实现,改为了提交时校验,如果有比较好的解决方案望大家提出

到此这篇关于vue 输入电话号码自动按3-4-4分割功能的实现代码的文章就介绍到这了,更多相关vue输入电话号码自动分割内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery聚焦文本框与扩展文本框聚焦方法
Oct 12 Javascript
JS中getYear()和getFullYear()区别分析
Jul 04 Javascript
js鼠标悬浮出现遮罩层的方法
Jan 28 Javascript
jQuery解决input超多的表单提交
Aug 10 Javascript
AngularJS基础 ng-init 指令简单示例
Aug 02 Javascript
Bootstrap的基本应用要点浅析
Dec 19 Javascript
jQuery实现遮罩层登录对话框
Dec 29 Javascript
angular实现商品筛选功能
Feb 01 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
Jun 30 Javascript
Vue计算属性的使用
Aug 04 Javascript
浅谈Vue网络请求之interceptors实际应用
Feb 28 Javascript
require.js 加载过程与使用方法介绍
Oct 30 Javascript
浅谈Vue3.0新版API之composition-api入坑指南
Apr 30 #Javascript
JavaScript变量Dom对象的所有属性
Apr 30 #Javascript
vue项目中使用bpmn为节点添加颜色的方法
Apr 30 #Javascript
VSCode搭建Vue项目的方法
Apr 30 #Javascript
jQuery实现的解析本地 XML 文档操作示例
Apr 30 #jQuery
vue使用map代替Aarry数组循环遍历的方法
Apr 30 #Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
Apr 30 #jQuery
You might like
javascript 模式设计之工厂模式学习心得
2010/04/27 Javascript
关于jQuery中的end()使用方法
2011/07/10 Javascript
JQuery插件jcarousellite的参数中文说明
2015/05/11 Javascript
javascript中setTimeout使用指南
2015/07/26 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
jquery基于layui实现二级联动下拉选择(省份城市选择)
2017/06/20 jQuery
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
JS+JQuery实现无缝连接轮播图
2020/12/30 jQuery
关于uniApp editor微信滑动问题
2021/01/15 Javascript
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
python实现文本文件合并
2015/12/29 Python
Python中的条件判断语句与循环语句用法小结
2016/03/21 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
Linux下python3.6.1环境配置教程
2018/09/26 Python
python3 property装饰器实现原理与用法示例
2019/05/15 Python
Python列表与元组的异同详解
2019/07/02 Python
Python算法中的时间复杂度问题
2019/11/19 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
python opencv圆、椭圆与任意多边形的绘制实例详解
2020/02/06 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
文秘人员工作职责
2014/01/31 职场文书
水电工岗位职责
2014/02/12 职场文书
中国梦我的梦演讲稿
2014/04/23 职场文书
中专毕业生的自荐书
2014/07/01 职场文书
机关作风建设心得体会
2014/10/22 职场文书
2015年教师节贺卡寄语
2015/03/24 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis
Django框架模板用法详解
2022/06/10 Python