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 相关文章推荐
js中判断用户输入的值是否为空的简单实例
Dec 23 Javascript
javascript 拷贝节点cloneNode()使用介绍
Apr 03 Javascript
JavaScript判断变量是对象还是数组的方法
Aug 28 Javascript
jQuery插件datepicker 日期连续选择
Jun 12 Javascript
js 判断各种数据类型的简单方法(推荐)
Aug 29 Javascript
Javascript中for循环语句的几种写法总结对比
Jan 23 Javascript
关于Javascript中document.cookie的使用
Mar 08 Javascript
浅析Javascript中双等号(==)隐性转换机制
Oct 27 Javascript
vue两个组件间值的传递或修改方式
Jul 04 Javascript
GOJS+VUE实现流程图效果
Dec 01 Javascript
JavaScript实现的开关灯泡点击切换特效示例
Jul 08 Javascript
js瀑布流布局的实现
Jun 28 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
PHP基础知识介绍
2013/09/17 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
2015/04/08 PHP
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
jquery select下拉框操作的一些说明
2010/04/02 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
利用bootstrapValidator验证UEditor
2016/09/14 Javascript
HTML的select控件美化
2017/03/27 Javascript
详解在Vue中如何使用axios跨域访问数据
2017/07/07 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
详解Python2.x中对Unicode编码的使用
2015/04/03 Python
python抓取最新博客内容并生成Rss
2015/05/17 Python
利用Python开发实现简单的记事本
2016/11/15 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
超简单的Python HTTP服务
2019/07/22 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
Django分组聚合查询实例分享
2020/04/29 Python
Burberry英国官网:英国标志性奢侈品牌
2017/03/29 全球购物
英国领先的体验日提供商:Buyagift
2019/04/19 全球购物
我看到了用指针调用函数的不同语法形式
2014/07/16 面试题
军训自我鉴定怎么写
2014/02/13 职场文书
减负增效提质方案
2014/05/23 职场文书
小学师德标兵先进事迹材料
2014/05/25 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
创业计划书之寿司
2019/07/19 职场文书