透過Vue實現限制數入字數
我們都知道,平常在社群網站上會限制使用者輸入的字數。最具代表性的網站就是Twitter,Twitter限制一般使用者每次發表文章的字數在140字以內。讓使用者用最簡短的文字來表達想法。對於優化使用者體驗比較好的方式是,當使用者在輸入的同時,提示使用者還有多少字可以輸入,當使用這輸入的字數達到限制時,及時地停止使用者繼續輸入。
像這樣子限制使用者輸入字數的機制要如何來實現呢?
今天我們就要透過Vue.js來製作一個可以幫我們控制輸入字數的程式。首先,我們先準備好需要的HTML檔案。
接下來,將vue.js加入檔案中。
建立Vue實例。
如此,就已經完成了一個Vue的檔案。
message的內容要顯示在html上面我們預先選好的位置。也就是
在 JavaScript 中想要判斷字串長度可以使用 length 來取得,如果要知道使用者輸入的字串長度到底多長,可以使用length來取得字數:
上面的式子可以得到message這字串的長度,也就是到底有多少字組成message這個字串。
有幾種解決方案可以採用。我們可以直接disable掉 input欄位讓input失效,或者是停止接收多出來的資料。這裡的實作範例採取第二種解決方案。
如果是想要用第二種方式解決的話,可以使用substring來裁切。JavaScript substring 可以在字串中擷取出設定好範圍的其中一段字串,
如下表示,對message這字串,從0這個位置開始(也就是最開頭的位置)裁切到10的地方。
1. 先雙向綁定message與
我們改造一下下面的textarea標籤:
移除placeholder,加上
我們設定兩個變數,要限制的字數用limit變數表示,剩餘字數則用remain表示。limit變數是一個固定值,由我們事先決定,可以寫在data中。remain則是透過使用者輸入的字數與limit變數相減而計算出來的結果,我們需要透過computed來計算。
並且在data中加入limit變數的初始值,並且設定為50。
透過前面提到的方式,在computed中計算remain的值。
下面是HTML部分的修改:
下面是javascript的部分,加上check() ,並且透過前面說的加上
我們把10換成limit變數,
到目前為止,基本的功能已經具備。我們可以再加上判斷式優化一下程式碼。
大功告成,下面是完整的程式碼。
像這樣子限制使用者輸入字數的機制要如何來實現呢?
有兩的點需要注意:
- 如何計算使用者輸入了多少字?
- 當使用這輸入的字數達到限制時,該如何停止繼續輸入?
今天我們就要透過Vue.js來製作一個可以幫我們控制輸入字數的程式。首先,我們先準備好需要的HTML檔案。
<!DOCTYPE html>
<html lang=“zh-TW”>
<head>
<meta charset=“UTF-8” />
<meta name=“viewport” content=“width=device-width, initial-scale=1.0” />
<meta http-equiv=“X-UA-Compatible” content=“ie=edge” />
<link rel=“stylesheet” href=“https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css”
integrity=“sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO” crossorigin=“anonymous” />
<title>Start</title>
</head>
<body>
<div id=“app” class=“container”>
<div class=“row”>
<div class=“col”>
<textarea cols=“30” rows=“5” type=“text” class=“form-control” placeholder=“輸入文字”></textarea>
<div class=“text-sm-right”>
<i>字數限制:50</i>
<i>剩餘字數:1/ 50</i>
</div>
</div>
</div>
<div class=“row”>
<div class=“col”>
<p>顯示文字</p>
</div>
</div>
</div>
</body>
</html>
接下來,將vue.js加入檔案中。
<script src=“https://cdn.jsdelivr.net/npm/vue/dist/vue.js”></script>
建立Vue實例。
<script>
app = new Vue({
el: "#app",
data: {
message: "這是一個APP",
},
});
</script>
如此,就已經完成了一個Vue的檔案。
message的內容要顯示在html上面我們預先選好的位置。也就是
<p>顯示文字</p>
這個地方,要把它替換成<p>{{ message }}</p>
。如此data裡面的message: "這是一個APP”
就會將『這是一個APP』顯示到<p></p>
裡面。你會看到html上面的結果是:<p>這是一個APP</p>
計算使用者輸入字數
由於我們想要限制使用者輸入的字數,必須先知道使用者已經輸入了多少字。在 JavaScript 中想要判斷字串長度可以使用 length 來取得,如果要知道使用者輸入的字串長度到底多長,可以使用length來取得字數:
message.length
上面的式子可以得到message這字串的長度,也就是到底有多少字組成message這個字串。
限制使用者輸入字數
另一個是,當使用者超過輸入的限制時,要如何裁切掉多出來的部分?有幾種解決方案可以採用。我們可以直接disable掉 input欄位讓input失效,或者是停止接收多出來的資料。這裡的實作範例採取第二種解決方案。
如果是想要用第二種方式解決的話,可以使用substring來裁切。JavaScript substring 可以在字串中擷取出設定好範圍的其中一段字串,
substr()
有兩個參數,第一個參數arg1是開始擷取的位置,第二個arg2是結束擷取的位置,也就是你想要擷取的字數數量。arg1與arg2決定了取出來的字串範圍。你可以自己設定擷取範圍,但參數不可以是負數,且不可以是兩個相同的數字,否則會行成空字串。substr(arg1,arg2)
如下表示,對message這字串,從0這個位置開始(也就是最開頭的位置)裁切到10的地方。
message.substr(0, 10)
實作
我們現在就利用這個方式計算一下使用者的輸入字數
1. 先雙向綁定message與<textarea>
的值
我們改造一下下面的textarea標籤:
< textarea cols=“30” rows=“5” type=“text” class=“form-control” placeholder=“ 輸入文字 ”>< / textarea >
移除placeholder,加上
v-model=“message”
< textarea cols=“30” rows=“5” type=“text” class=“form-control” v-model=“message”>< / textarea >
2.計算字數
我們預計將字數限制與剩餘字數顯示在下面區塊,我們設定兩個變數,要限制的字數用limit變數表示,剩餘字數則用remain表示。limit變數是一個固定值,由我們事先決定,可以寫在data中。remain則是透過使用者輸入的字數與limit變數相減而計算出來的結果,我們需要透過computed來計算。
<div class=“text-sm-right”>
<i>字數限制:50</i>
<i>剩餘字數:1/ 50</i>
</div>
可以改成:
<div class=“text-sm-right”>
<i>字數限制:{{ limit }}</i>
<i>剩餘字數:{{ remain }}/ {{ limit }}</i>
</div>
並且在data中加入limit變數的初始值,並且設定為50。
data: {
Message: “這是一個APP”,
limit: 50
},
透過前面提到的方式,在computed中計算remain的值。
this.limit - this.message.length
其中 this.limit
為限制的字數,this.message.length
為使用者輸入的字數。computed: {
remain() {
return this.limit - this.message.length;
}
},
3.設置限制使用者輸入字數機制
接下來製作一個check方法,一旦使用者輸入完畢的時候,就啟動check方法檢查字數。在< textarea >
加上v-on:input
,當input完畢,啟動vi-on,呼叫check方法。下面是HTML部分的修改:
< textarea cols=“30” rows=“5” type=“text” class=“form-control” v-on:input=“check” v-model=“message”>< / textarea >
下面是javascript的部分,加上check() ,並且透過前面說的加上
this.message.substr(0, 10)
,如此使用者只能輸入10個字串。如果超過10個字,就會因為 this.message = this.message.substr(0, 10)
而只接受10個數字:<script>
app = new Vue({
el: “#app",
data: {
message: “這“一個APP”,” },
methods: {
check() {
this.message = this.message.substr(0, 10)
}
},
});
</script>
我們把10換成limit變數,
message.substr(0, this.limit)
就表示從0這個位置開始裁切到 limit變數設定的字數,由於data中的limit被設定為50,因此我們可以輸入50個字,如果想要增加或者減少字數,只需要在limit變數的地方修改數值就可以。如此式子就比上面更有彈性。 methods: {
check() {
this.message = this.message.substr(0, this.limit)
}
},
到目前為止,基本的功能已經具備。我們可以再加上判斷式優化一下程式碼。
methods: {
check() {
if (this.remain < 0) {
this.message = this.message.substr(0, this.limit)
};
}
},
加上CSS效果,警告使用者已經達到輸入上限。由於我們使用Bootstrap4,所以可以使用 .is-invalid
來切換效果Forms · Bootstrap
當remain為false的時候,就會綁定.is-invalid
v-bind:class=“{‘is-invalid’:!remain}”
大功告成,下面是完整的程式碼。
留言
張貼留言