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 相关文章推荐
jQueryMobile之Helloworld与页面切换的方法
Feb 04 Javascript
js+HTML5实现视频截图的方法
Jun 16 Javascript
学习JavaScript设计模式(策略模式)
Nov 26 Javascript
浅谈js中调用函数时加不加括号的问题
Jul 28 Javascript
基于WebUploader的文件上传js插件
Aug 19 Javascript
BootStrap 超链接变按钮的实现方法
Sep 25 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
Dec 08 Javascript
Bootstrap源码解读模态弹出框(11)
Dec 28 Javascript
vue组件中使用props传递数据的实例详解
Apr 08 Javascript
JS中的两种数据类型及实现引用类型的深拷贝的方法
Aug 12 Javascript
微信小程序获取地理位置及经纬度授权代码实例
Sep 18 Javascript
详解vue 中 scoped 样式作用域的规则
Sep 14 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
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
php实现单链表的实例代码
2013/03/22 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
jquery 如何动态添加、删除class样式方法介绍
2012/11/07 Javascript
jquery indexOf使用方法
2013/08/19 Javascript
如何获取select下拉框的值(option没有及有value属性)
2013/11/08 Javascript
判断javascript的数据类型(示例代码)
2013/12/11 Javascript
jquery实现省市select下拉框的替换(示例代码)
2014/02/22 Javascript
jquery获取多个checkbox的值异步提交给php
2015/07/07 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
利用Three.js如何实现阴影效果实例代码
2017/09/26 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
详解webpack模块化管理和打包工具
2018/04/21 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
在Python中使用SQLite的简单教程
2015/04/29 Python
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
Python实现八皇后问题示例代码
2018/12/09 Python
详解python 破解网站反爬虫的两种简单方法
2020/02/09 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
Python3+Django get/post请求实现教程详解
2021/02/16 Python
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
服务标兵事迹材料
2014/05/04 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
晚会闭幕词
2015/01/28 职场文书
对外汉语教师推荐信
2015/03/27 职场文书
2015年信访工作总结
2015/04/07 职场文书
地道战观后感300字
2015/06/04 职场文书
班主任寄语2016
2015/12/04 职场文书
室外天线与收音机天线杆接合方法
2022/04/05 无线电
win10键盘驱动怎么修复?Win10键盘驱动修复小技巧
2022/04/06 数码科技