需求
需求:結(jié)合Vue實現(xiàn)下面的效果
輸入框中最多輸入16個字符
漢字最多顯示5個,超出部分以...
顯示
英文最多顯示10個,超出部分以...
顯示
實現(xiàn)
搭建簡單頁面,并設(shè)置簡單樣式
在正式開始寫核心代碼之前,要先把代碼結(jié)構(gòu)搭建起來,這樣后面寫的時候就會看著簡潔點了。
首先需要一個輸入框用來輸入內(nèi)容,其次需要一個元素,用來顯示輸入框中的內(nèi)容,實現(xiàn)數(shù)據(jù)的雙向綁定。
其中,輸入內(nèi)容的最大長度是可以通過input標(biāo)簽的屬性來指定的。
<p id="app"> <input v-model="txt" class="clsinp" maxlength="16" placeholder="請輸入內(nèi)容" type="text"> <p class="clsmsg"> <p>內(nèi)容:<span>{{txt}}</span></p> <p>輸入的字符個數(shù):<span>{{computedCharLen}}</span></p> <p>輸入的字節(jié)個數(shù):<span>{{computedByteLen}}</span></p> </p> </p>
頁面的結(jié)構(gòu)已經(jīng)搭建完成了,那下面就是做一些簡單的樣式優(yōu)化了。
* { margin: 0; padding: 0; -webkit-box-sizing: border-box; box-sizing: border-box; } body { background: #efefef; } .clsinp { width: 100%; height: 40px; outline: none; line-height: 40px; font-size: 16px; padding: 0 10px; margin-top: 20px; color: blue; } .clsmsg { padding: 10px 10px; } .clsmsg span { color: blue; }
最后一步應(yīng)該就是引入Vue,然后搭建一些簡單的數(shù)據(jù)內(nèi)容。
var vm = new Vue({ el: '#app', data() { return { txt: '' } }, // 后期代碼在下面補充 })
ASCII范圍內(nèi)與范圍外
了解ASCII的內(nèi)容,請移步到http://www.asciima.com/
。
ASCII中包含256個字符,因此超過256之外的字符,全部都是非ASCII字符,一般情況下,漢字就是在這個范圍中。
因此,編碼不在0-255的字符可以使用正則表達(dá)式/[^\x00-\xff]/g
來進行匹配。這個時候就提供了一個思路,如果不是ASCII碼中的字符,那么就默認(rèn)它占了兩個字節(jié)。
我們修改一下頁面結(jié)構(gòu),輸出一些測試信息:
<p id="app"> <input v-model="txt" class="clsinp" maxlength="16" placeholder="請輸入內(nèi)容" type="text"> <p class="clsmsg"> <p>內(nèi)容:<span>{{txt}}</span></p> <p>輸入的字符個數(shù):<span>{{computedCharLen}}</span></p> <p>輸入的字節(jié)個數(shù):<span>{{computedByteLen}}</span></p> </p> </p>
補充需要的計算屬性:
computed: { // 獲取字符的個數(shù) computedCharLen() { return this.txt.length }, // 獲取字節(jié)的個數(shù) computedByteLen() { return this.txt.replace(/[^\x00-\xff]/g, '01').length } }
這個時候,我們輸入內(nèi)容,出現(xiàn)下面的效果:
這個時候會發(fā)現(xiàn),已經(jīng)實現(xiàn),ASCII碼范圍內(nèi)的占1位,超出范圍的占2位。
控制顯示的內(nèi)容
內(nèi)容顯示使用計算屬性來實現(xiàn):
<p>內(nèi)容:<span>{{computedTxt}}</span></p>
// 控制顯示的內(nèi)容 computedTxt() { return this.methodGetByteLen(this.txt, 10) }
下面補充一下methodGetByteLen
方法:
/** * str 需要控制的字符串 * len 字節(jié)的長度,如5個漢字,10個英文,輸入?yún)?shù)就是10 */ methodGetByteLen(str, len) { // 如果字節(jié)的長度小于控制的長度,那么直接返回 if (this.computedByteLen <= len) { return str } for (let i = Math.floor(len / 2); i < str.length; i++) { if (str.substr(0, i).replace(/[^\x00-\xff]/g, '01').length >= len) { // Math.floor(i / 2) * 這里是控制特殊情況的顯示 // 如 '一二aaa一二三四',顯示的結(jié)果就是 '一二aaa一...' return str.substr(0, Math.floor(i / 2) * 2) + '...' } } }
最終的顯示情況沒有超過最大指定長度的情況
超過最大指定長度(漢字輸入)
超過最大指定長度(數(shù)字輸入)
超過最大指定長度(漢字和字母的組合)
完整代碼
最后,把最終代碼粘貼出來:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta txt="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style type="text/css"> * { margin: 0; padding: 0; -webkit-box-sizing: border-box; box-sizing: border-box; } body { background: #efefef; } .clsinp { width: 100%; height: 40px; outline: none; line-height: 40px; font-size: 16px; padding: 0 10px; margin-top: 20px; color: blue; } .clsmsg { padding: 10px 10px; } .clsmsg span { color: blue; } </style> </head> <body> <p id="app"> <input v-model="txt" class="clsinp" maxlength="16" placeholder="請輸入內(nèi)容" type="text"> <p class="clsmsg"> <p>內(nèi)容:<span>{{computedTxt}}</span></p> <p>輸入的字符個數(shù):<span>{{computedCharLen}}</span></p> <p>輸入的字節(jié)個數(shù):<span>{{computedByteLen}}</span></p> </p> </p> </body> </html> <script type="text/javascript" src="./vue2.5.1.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data() { return { txt: '' } }, // 后期代碼在下面補充 methods: { methodGetByteLen(str, len) { if (this.computedByteLen <= len) { return str } for (let i = Math.floor(len / 2); i < str.length; i++) { if (str.substr(0, i).replace(/[^\x00-\xff]/g, '01').length >= len) { return str.substr(0, Math.floor(i / 2) * 2) + '...' } } } }, computed: { // 獲取字符的個數(shù) computedCharLen() { return this.txt.length }, // 獲取字節(jié)的個數(shù) computedByteLen() { return this.txt.replace(/[^\x00-\xff]/g, '01').length }, // 控制顯示的內(nèi)容 computedTxt() { return this.methodGetByteLen(this.txt, 10) } } }) </script>
相信看了本文案例你已經(jīng)掌握了方法,更多精彩請關(guān)注Gxl網(wǎng)其它相關(guān)文章!
推薦閱讀:
怎樣實現(xiàn)微信小程序的自定義多選事件
如何對于create-react-app修改為多頁面支持
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com