透過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}”
大功告成,下面是完整的程式碼。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!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="{'is-invalid':!remain}" class="form-control" | |
@input="check" v-model="message"></textarea> | |
<div class="text-sm-right"> | |
<i>字數限制:{{limit}}</i> | |
<i>剩餘字數:{{remain}}/ {{limit}}</i> | |
</div> | |
</div> | |
</div> | |
<div class="row"> | |
<div class="col"> | |
<p>{{ message }}</p> | |
</div> | |
</div> | |
</div> | |
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> | |
<script> | |
app = new Vue({ | |
el: "#app", | |
data: { | |
message: "這是一個APP", | |
limit: 50, | |
}, | |
computed: { | |
remain() { | |
return this.limit - this.message.length | |
} | |
}, | |
methods: { | |
check() { | |
if (this.remain < 0) { | |
this.message = this.message.substr(0, this.limit) | |
}; | |
} | |
}, | |
}); | |
</script> | |
</body> | |
</html> |
留言
張貼留言