好处和要点
利用HTML5 validation API和简单的几行JS代码就可以实现比较轻量可用的校验功能。而不需要编写大量JS代码或者学习和引入一个复杂的校验框架。例如vuelidate就是一个比较复杂的框架。
当然了,如果需要比较复杂的功能,例如异步校验,那么就可能需要引入一个插件。
具体解释
以前的表单校验的功能可能大部分都依赖与JS。例如判断电子邮件是否合规,判断字符串长度是否是在6到30位之间。
自从有了HTML5 validation API之后,我们就可以这部分逻辑交给内置API。例如,判断email的合规性时就不再需要自己写出email的正则了。只需要在input加上type="email"
。
<input id="email" v-model="form.email" type="email" class="validate">
然后再调用element.checkValidity()
方法来检查合规性。
可用示例(Vue.js+materializecss)
<template>
<div class="contact">
<h4>预约回电</h4>
<p>请填写下表,免费向设计专家咨询。设计专家将尽快与您联络。致电时间为星期一至星期五,上午 9:00 至下午 6:00 (GMT+8)</p>
<form>
<div class="row">
<div class="input-field col s12">
<input id="name" v-model="form.name" type="text" class="validate" required="true">
<span class="left error">请填写名字</span>
<label for="name">名字</label>
</div>
<div class="input-field col s12">
<input id="email" v-model="form.email" type="email" class="validate">
<span class="left error">请填写正确的邮箱</span>
<label for="email">邮箱(可选)</label>
</div>
<div class="input-field col s12">
<input id="phone" type="tel" v-model="form.phone" class="validate" required="true">
<span class="left error">请填写正确的手机号码</span>
<label for="phone">手机</label>
</div>
<div class="input-field col s12">
<textarea id="content" v-model="form.content" class="materialize-textarea validate" placeholder="咨询内容" required="true"></textarea>
<span class="left error">请填写咨询内容</span>
</div>
<div class="input-field col s12">
<input type="submit" class="btn-large" @click.prevent="sendContent" value="提交">
</div>
</div>
</form>
</div>
</template>
<script>
export default {
name: "Contact",
data: function () {
return {
form: {
name: "",
email: "",
phone: "",
content: ""
}
};
},
methods: {
validateId(elemID) {
let elem = document.getElementById(elemID);
let elemErr = document.querySelector('#'+elemID+' + span')
if (!elem.checkValidity()) {
elemErr.style.display = 'block';
return false
} else {
elemErr.style.display = "none";
return true
}
},
sendContent() {
// form validation
if (!this.validateId('name') || !this.validateId('email') || !this.validateId('phone') || !this.validateId('content')) {
console.log('vname')
return
}
console.log(this.form)
}
},
mounted: function () {}
};
</script>
<style lang="scss" scoped>
.contact {
max-width: 600px;
margin-left: auto;
margin-right: auto;
}
.btn-large {
width: 150px;
}
span.error {
display: none;
color: lightcoral;
}
</style>
效果图
实用校验JS代码片段
下面是判断手机号和电子邮件的代码。
// 判断是否是手机号或电子邮件
const emailOrPhone = (value) => {
return validateEmail(value) || validatePhone(value)
}
function validateEmail (email) {
var re = /\S+@\S+\.\S+/
return re.test(email)
}
function validatePhone (phone) {
var re = /^\d{11}$/
return re.test(phone)
}