1. 程式人生 > >vue手機號按344分隔,銀行卡號每4位空格分隔

vue手機號按344分隔,銀行卡號每4位空格分隔

max 位置 span pre event ie瀏覽器 提取 his this

實現效果:

1. 手機號輸入/粘貼時,不允許輸入數字外的其它字符,按344分隔,最大輸入11位數字

2. 銀行卡號輸入/粘貼時,不允許輸入數字外的其它字符,每四位用空格分隔

技術分享圖片

代碼:

<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:

 1 <script>
 2     export default {
 3         data() {
 4             return {
 5                 mobile: ‘‘,
 6                 card: ‘‘
 7             }
 8         },
 9         methods: {
10             inputMobile() {
11                 let value = this.mobile.replace(/\D/g, ‘‘).substr(0, 11) //
不允許輸入非數字字符,超過11位數字截取前11位 12 let len = value.length 13 if (len > 3 && len < 8) { 14 value = value.replace(/^(\d{3})/g, ‘$1 ‘) 15 } else if (len >= 8) { 16 value = value.replace(/^(\d{3})(\d{4})/g, ‘$1 $2 ‘)
17 } 18 this.mobile = value 19 }, 20 inputCard() { 21 this.card = this.card.replace(/\D/g, ‘‘) // 不允許輸入非數字字符 22 this.card = this.card.replace(/(\d{4})(?=\d)/g, ‘$1 ‘) // 4位一組,非獲取匹配最後一組數字,避免刪除到空格時會馬上自動補齊 23 } 24 } 25 } 26 </script>

上述方案即可實現基本效果,但如果從中間開始刪除或添加內容時,光標會自動跑到最後,如下:

技術分享圖片

若想光標留在刪除/添加內容位置,需要設置光標位置:

技術分享圖片

修改js如下:

 1 <script>
 2     export default {
 3         data () {
 4             return {
 5                 mobile: ‘‘,
 6                 card: ‘‘
 7             }
 8         },
 9         methods: {
10             inputMobile (e) {
11                 this.formatMobile(e)
12                 this.mobile = this.$refs.mobile.value
13             },
14             formatMobile (e) {
15                 let val = this.$refs.mobile.value // 不可直接用this.mobile,第一方便提取該方法降低代碼耦合度,第二直接用this.mobile,在輸入漢字時按下shift按鍵會導致無法再輸入和刪除內容
16                 let selStart = this.$refs.mobile.selectionStart // 選中區域左邊界位置
17                 let mobileLen = val.length
18                 let value = this.getValue(e, val).substr(0, 11) // 獲取輸入/粘貼內容,並截取前11位
19                 let len = value.length
20                 if (len > 3 && len < 8) {
21                     value = value.replace(/^(\d{3})/g, ‘$1 ‘)
22                 } else if (len >= 8) {
23                     value = value.replace(/^(\d{3})(\d{4})/g, ‘$1 $2 ‘)
24                 }
25                 this.$refs.mobile.value = value
26                 if (selStart !== mobileLen) {
27                     if (selStart === 3) {
28                         selStart++
29                     }
30                     // 設置光標位置
31                     this.$refs.mobile.selectionStart = this.$refs.mobile.selectionEnd = selStart
32                 }
33             },
34             getValue(e, val) {
35                 let value = ‘‘
36                 if (e.type === ‘keyup‘) {
37                     value = val.replace(/\D/g, ‘‘)
38                 } else if (e.type === ‘paste‘) {
39                     // window.clipboardData:IE瀏覽器獲取剪貼板數據對象
40                     // event.clipboardData:Chrome, Firefox, Safari獲取剪貼板數據對象
41                     let clipboardData = event.clipboardData || window.clipboardData;
42                     value = clipboardData.getData(‘Text‘); // 獲取剪貼板text格式的數據
43                     value = value.replace(/\D/g, ‘‘)
44                 }
45                 return value
46             }
47         }
48     }
49 </script>

未實現:

不允許粘貼非數字內容到輸入框還未實現,改為了提交時校驗,如果有比較好的解決方案望大家提出

vue手機號按344分隔,銀行卡號每4位空格分隔