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实现的表格分页实现代码
Jun 21 Javascript
类似php的js数组的in_array函数自定义方法
Dec 27 Javascript
jQuery实现的多选框多级联动插件
May 02 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
Sep 30 Javascript
微信小程序实现多选删除列表数据功能示例
Jan 15 Javascript
vue实现滑动超出指定距离回顶部功能
Jul 31 Javascript
JS自定义滚动条效果
Mar 13 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
Jul 20 Javascript
简单了解three.js 着色器材质
Aug 03 Javascript
vue 扩展现有组件的操作
Aug 14 Javascript
jquery简易手风琴插件的封装
Oct 13 jQuery
使用vuex-persistedstate本地存储vuex
Apr 29 Vue.js
浅谈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
php下实现在指定目录搜索指定类型文件的函数
2008/10/03 PHP
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
php删除文件夹及其文件夹下所有文件的函数代码
2013/01/23 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
LBS blog sql注射漏洞[All version]-官方已有补丁
2007/08/26 Javascript
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
javascript简单实现类似QQ头像弹出效果的方法
2015/08/03 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
JS获取短信验证码倒计时的实现代码
2017/05/22 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
[00:36]DOTA2风云人物相约完美“圣”典 12月17日不见不散
2016/11/30 DOTA
Python数据结构之Array用法实例
2014/10/09 Python
Python中统计函数运行耗时的方法
2015/05/05 Python
如何在python字符串中输入纯粹的{}
2018/08/22 Python
numpy基础教程之np.linalg
2019/02/12 Python
python实现自动清理重复文件
2020/08/24 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
了解AppleTalk协议吗
2014/04/01 面试题
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
《守株待兔》教学反思
2014/03/01 职场文书
档案保密承诺书
2014/06/03 职场文书
2014年节能降耗工作总结
2014/12/11 职场文书
写给老婆的保证书
2015/02/27 职场文书
创先争优活动个人总结
2015/03/04 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
django 认证类配置实现
2021/11/11 Python