以前 Form Validation 要完全使用 JavaScript,HTML 5 將常用檢查功能內建,可大幅減少 JavaScript 長度。
Version
HTML 5
HTML 5

當沒有任何輸入時,按下 Submit 會出現警告訊息。

當輸入字串長度小於 5 時,按下 Submit 也會出現警告訊息。

當有輸入字串且長度大於 5 時,才會觸發原本的 submit event。
<template>
<form @submit.prevent="onSubmit">
<input ref="username" @invalid.capture.prevent="onInvalid" required minlength="5">
<button>Submit</button>
<p>{{ msg }}</p>
</form>
</template>
<script>
let onSubmit = function() {
this.msg = 'Submit event fired'
}
let onInvalid = function() {
if (this.$refs.username.validity.valueMissing)
this.msg = 'User name is required'
else if (this.$refs.username.validity.tooShort)
this.msg = 'User name is too short'
}
export default {
name: "App",
data: () => ({
msg: ''
}),
methods: {
onSubmit,
onInvalid
}
}
</script>
第 2 行
<form @submit.prevent="onSubmit">
<input ref="username" @invalid.capture.prevent="onInvalid" required minlength="5">
<button>Submit</button>
<p>{{ msg }}</p>
</form>
若要使用 HTML 5 Form Validation,則 <input> 必須放在 <form> 內,且不能使用 <button> 的 click event,而要使用 <form> 的 submit event。
<form @submit.prevent="onSubmit">
<form> 的 submit event 預設會 post 到 server,因為現在會使用 Ajax 打 RESTful API,因此會在 @submit 加上 prevent modifier 避免 <form> post 到 server,相當於 event.preventDefault()。
<input ref="username" @invalid.capture.prevent="onInvalid" required minlength="5">
由於我們想判斷 <input> 為 必填 且 長度需大於 5,使用了 HTML 5 的 required 與 minlength="5" attribute。
HTML 5 判斷時會觸發 invalid event,且會在 <input> 以 popup 顯示預設錯誤訊息,但因為我們只想借用 HTML 5 Form Validation,並不想以 popup 顯示,因此使用了 invalid.capture.prevent。
- capture:原本的 HTML 5 會先由內而外觸發
popupevent 然後才是invalidevent,為了阻擋 popup 顯示,特別使用capturemodifier 改成由外向內先觸發invalidevent,如此才能避免 popup 顯示。 - prevent:為了避免
invalidevent 執行完又觸發popupevent,因此使用preventmodifier 避免invalidevent 執行完後繼續執行popupevent。
HTML 5 主要以 element 控制,而非 Vue 的 model-driven 寫法,因此特別加上 ref="username",稍後將以 username 控制 <input> element。
14 行
let onInvalid = function() {
if (this.$refs.username.validity.valueMissing)
this.msg = 'User name is required'
else if (this.$refs.username.validity.tooShort)
this.msg = 'User name is too short'
}
HTML 5 允許我們由 element 的 validity.valueMissing 與 validity.tooShort 判斷 required 與 minlength="5" 是否成立。
由於 validity 是在 <input> element 下,因此必須透過 this.$refs.username 取得 <input>。
第 10 行
let onSubmit = function() {
this.msg = 'Submit event fired'
}
當 invalid event 都沒錯時,才會執行 submit event 完成 Form Validation。
Conclusion
- 可發現 HTML 5 Form Validation 寫法非常繁瑣,除了須小心控制 event 外,還必須小心處理 element,更可發現 Vue 的 model-driven 寫法之精簡
- 若要使用原生 DOM 寫法,則必須搭配
$refs取得 element