結合Vue控制字符和字節(jié)的顯示個數(shù)的示例
需求
需求:結合Vue實現(xiàn)下面的效果
- 輸入框中最多輸入16個字符
- 漢字最多顯示5個,超出部分以
...顯示 - 英文最多顯示10個,超出部分以
...顯示
實現(xiàn)
搭建簡單頁面,并設置簡單樣式
在正式開始寫核心代碼之前,要先把代碼結構搭建起來,這樣后面寫的時候就會看著簡潔點了。
首先需要一個輸入框用來輸入內(nèi)容,其次需要一個元素,用來顯示輸入框中的內(nèi)容,實現(xiàn)數(shù)據(jù)的雙向綁定。
其中,輸入內(nèi)容的最大長度是可以通過input標簽的屬性來指定的。
<div id="app">
<input v-model="txt" class="clsinp" maxlength="16" placeholder="請輸入內(nèi)容" type="text">
<div class="clsmsg">
<p>內(nèi)容:<span>{{txt}}</span></p>
<p>輸入的字符個數(shù):<span>{{computedCharLen}}</span></p>
<p>輸入的字節(jié)個數(shù):<span>{{computedByteLen}}</span></p>
</div>
</div>
頁面的結構已經(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; }
最后一步應該就是引入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的字符可以使用正則表達式/[^\x00-\xff]/g來進行匹配。這個時候就提供了一個思路,如果不是ASCII碼中的字符,那么就默認它占了兩個字節(jié)。
我們修改一下頁面結構,輸出一些測試信息:
<div id="app">
<input v-model="txt" class="clsinp" maxlength="16" placeholder="請輸入內(nèi)容" type="text">
<div class="clsmsg">
<p>內(nèi)容:<span>{{txt}}</span></p>
<p>輸入的字符個數(shù):<span>{{computedCharLen}}</span></p>
<p>輸入的字節(jié)個數(shù):<span>{{computedByteLen}}</span></p>
</div>
</div>
補充需要的計算屬性:
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一二三四',顯示的結果就是 '一二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>
<div id="app">
<input v-model="txt" class="clsinp" maxlength="16" placeholder="請輸入內(nèi)容" type="text">
<div class="clsmsg">
<p>內(nèi)容:<span>{{computedTxt}}</span></p>
<p>輸入的字符個數(shù):<span>{{computedCharLen}}</span></p>
<p>輸入的字節(jié)個數(shù):<span>{{computedByteLen}}</span></p>
</div>
</div>
</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>
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
vue + vuex todolist的實現(xiàn)示例代碼
這篇文章主要介紹了vue + vuex todolist的實現(xiàn)示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-03-03
Vue3.x如何操作v-html指令中HTML的DOM和樣式
在 Vue3.x 中,v-html 指令用于將 HTML 字符串渲染為真實的 DOM 元素,下面我們來看看具體如何操作v-html指令中HTML的DOM和樣式吧2025-04-04
Vue中foreach數(shù)組與js中遍歷數(shù)組的寫法說明
這篇文章主要介紹了Vue中foreach數(shù)組與js中遍歷數(shù)組的寫法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
vue+node+socket io實現(xiàn)多人互動并發(fā)布上線全流程
這篇文章主要介紹了vue+node+socket io實現(xiàn)多人互動并發(fā)布上線全流程,本文給大家提到了socket.io相關用法概覽及開發(fā)流程,需要的朋友可以參考下2021-09-09

