您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > HTML

使用HTML和Vuejs进行表单验证

时间:2019-08-12 11:07:56  来源:  作者:

他们说大多数网络应用只是html表单。好吧,表单需要验证,谢天谢地,HTML5带有许多优秀的内置表单验证功能,可用于电子邮件,数字,最大值,分钟等。您甚至可以使用模式编写自己的验证规则。在本文中,我将讨论如何在覆盖无聊的默认值时利用HTML5验证,以便您可以根据需要显示验证错误。我将与Vuejs合作,但即使你不使用Vue,你也可以随时跟进。

让我们从Bootstrap示例的Checkout表单的开始,这样我们就不必过于担心样式了。您可以在此处克隆器。设置应如下所示:

 

使用HTML和Vuejs进行表单验证

 

 

使用Vuejs Starter进行HTML验证

默认的HTML5验证不会立即显示所有表单错误。具有讽刺意味的是,一旦用户提交,浏览器实际上就知道所有无效字段,所以现在我们所要做的就是检查它们然后显示我们喜欢的内容。

现在让我们为表单和一个使用Vuejs捕获提交事件的监听器添加一个id。

<form class="needs-validation" id="validated-form">
 <div class="row">
 <div class="col-md-6 mb-3">
 <label for="firstName">First name</label>
 <input type="text" class="form-control" id="firstName" placeholder="" value="" required>
 <div class="invalid-feedback">
 Valid first name is required.
 </div>
 </div>
 <div class="col-md-6 mb-3">
 <label for="lastName">Last name</label>
 <input type="text" class="form-control" id="lastName" placeholder="" value="" required>
 <div class="invalid-feedback">
 Valid last name is required.
 </div>
 </div>
 </div>
 <!-- Rest of the form removed to save space -->
 <button class="btn btn-primary btn-lg btn-block" type="submit" @click.prevent="submitForm()">SUBMIT</button>
</form>

添加事件监听器以提交表单

然后在我们的form-validation.js文件中,我们将初始化Vuejs并创建处理表单提交和验证的方法。

const vueApp = new Vue({
 el: '#validated-form',
 methods: {
 submitForm () {
 if (this.validateForm()) {
 console.log('formValidated');
 //submit form to backend
 }
 },
 validateForm () {
 var formId = 'validated-form';
 var nodes = document.querySelectorAll(`#${formId} :invalid`);
 console.log(nodes);
 return true;
 }
 }
});

这里我们创建了两个方法submitFormvalidateForm。submitForm调用validateForm,如果满足所有验证规则,则返回true。现在,我们从控制日志记录中查看所有无效的表单输入,我们可以找到许多有趣的属性,包括我们可以向用户显示的validationMessage

 

使用HTML和Vuejs进行表单验证

 

 

输入属性无效

接下来,让我们创建将保存每个无效输入的validationErrors的数据属性。然后我们将循环遍历无效输入数组以设置每个输入。

const vueApp = new Vue({
 el: '#validated-form',
 data: function () {
 return {
 validationErrors: {
 firstName: null,
 lastName: null,
 username: null,
 email: null,
 address: null,
 country: null,
 state: null,
 zip: null,
 }
 }
 },
 methods: {
 submitForm () {
 if (this.validateForm()) {
 alert('Form Submitted')
 //submit form to backend
 }
 },
 validateForm () {
 var formId = 'validated-form';
 var nodes = document.querySelectorAll(`#${formId} :invalid`);
 var errorObjectName = 'validationErrors';
 var vm = this; //current vue instance;
 Object.keys(this[errorObjectName]).forEach(key => {
 this[errorObjectName][key] = null
 });
 if (nodes.length > 0) {
 nodes.forEach(node => {
 this[errorObjectName][node.name] = node.validationMessage;
 node.addEventListener('change', function (e) {
 vm.validateForm();
 });
 });
 return false;
 }
 else {
 return true;
 }
 }
 }
});

在这里,我们做了很多事情。我们创建了validationErrors数据属性来保存每个字段的错误消息。validationErrors对象的每个属性对应于要验证的每个表单元素的name属性。因此在validateForm方法中,我们清除任何先前的错误消息,然后遍历无效字段以设置其相应的validationErrors。我们还添加了一个事件侦听器,一旦无效字段发生更改,就会重新验证。

现在我们需要为要验证的每个字段添加名称属性,这在制作表单时非常正常。然后,我们还应该添加将向用户显示错误消息的span元素。

<form class="needs-validation" id="validated-form">
 <div class="row">
 <div class="col-md-6 mb-3">
 <label for="firstName">First name</label>
 <input type="text" class="form-control" name="firstName" placeholder="" value="" required>
 <span class="text-danger" v-if="validationErrors.firstName" v-text="validationErrors.firstName"></span>
 </div>
 <div class="col-md-6 mb-3">
 <label for="lastName">Last name</label>
 <input type="text" class="form-control" name="lastName" placeholder="" value="" required>
 <span class="text-danger" v-if="validationErrors.lastName" v-text="validationErrors.lastName"></span>
 </div>
 </div>
 <div class="mb-3">
 <label for="username">Username</label>
 <div class="input-group">
 <div class="input-group-prepend">
 <span class="input-group-text">@</span>
 </div>
 <input type="text" class="form-control" name="username" placeholder="Username" required>
 <span class="text-danger" v-if="validationErrors.username" style="width: 100%;" v-text="validationErrors.username"></span>
 </div>
 </div>
 <div class="mb-3">
 <label for="email">Email <span class="text-muted">(Optional)</span></label>
 <input type="email" class="form-control" name="email" placeholder="you@example.com">
 <div class="text-danger" v-if="validationErrors.email" style="width: 100%;">
 <span v-text="validationErrors.email"></span>
 </div>
 </div>
 
 <!-- Rest of form hidden for space -->
 <button class="btn btn-primary btn-lg btn-block" type="submit"
 @click.prevent="submitForm()">SUBMIT</button>
</form>

现在,一旦我们提交表单,我们的用户就可以看到他们需要修复的所有验证错误。很酷的是我们已经完成了它而无需引入额外的库来进行验证。现在,因为我们正在利用Vue的数据绑定能力,我们可以从这里获得有关我们希望如何显示错误的创意。


使用HTML5模式

如果我们需要超出可用的验证规则,该怎么办?例如,检查邮政编码是否有效。这就是HTML5模式非常有用的地方,因为我们可以在HTML中编写正则表达式来执行我们需要的任何类型的检查。我觉得有人正在宣誓正常表达,但幸运的是你可以在html5pattern.com找到一大堆有用的正则表达式。

好吧,找到一个正则表达式比我想象的要困难一些。事实证明,他们大多是7位数字。所以[0-9] {13,16}应该可以正常工作。现在我们遇到了一个新问题。关于HTML5模式的错误消息不是很有用,所以我们需要指定自己的。我们需要一种方法来告诉validateForm函数显示什么消息。

<form class="needs-validation" id="validated-form">
 <div class="row">
 <!-- Rest of form hidden for space -->
 
 <div class="col-md-3 mb-3">
 <label for="zip">Zip</label>
 <input type="text" class="form-control" name="zip" placeholder="" pattern="[0-9]{7}" title="Invalid Zip Code" required>
 <span class="text-danger" v-if="validationErrors.zip" style="width: 100%;" v-text="validationErrors.zip"></span>
 </div>
 </div>
 <button class="btn btn-primary btn-lg btn-block" type="submit"
 @click.prevent="submitForm()">SUBMIT</button>
</form>

添加标题和模式属性

然后我们可以在validateForm方法中检查title属性:

validateForm (formId = 'validated-form', errorObjectName = 'validationErrors') {
 var nodes = document.querySelectorAll(`#${formId} :invalid`);
 var vm = this; //current vue instance;
 Object.keys(this[errorObjectName]).forEach(key => {
 this[errorObjectName][key] = null
 });
 if (nodes.length > 0) {
 nodes.forEach(node => {
 if (node.title) {
 this[errorObjectName][node.name] = node.title;
 }
 else {
 this[errorObjectName][node.name] = node.validationMessage;
 }
 node.addEventListener('change', function (e) {
 vm.validateForm(formId, errorObjectName);
 });
 });
 return false;
 }
 else {
 return true;
 }
}

这里我们添加了一个if-else块来检查title属性,如果找不到则只显示默认错误消息。此外,formIderrorObjectName变量现在被传递到validateForm函数,这允许我们在同一个网页上验证我们选择的方式和方式。


我们已经能够为表单验证创建一个简单的约定配置方法。一旦我们在validationErrors对象中指定了表单字段的名称属性,我们的cool validateForm函数就会利用内置的HTML5功能来完成剩下的工作,我们需要做的就是按照我们想要的方式显示错误。一如既往,我希望这有助于某人。

如果您正在使用Vue,则可以使用此代码段快速启动验证,并且它也不应该很难应用于其他前端框架。您还可以 此repo演示网站找到本文的工作代码。

干杯!

转:https://itnext.io/form-validation-with-html-vuejs-54ec18e473aa



Tags:HTML   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
《开源精选》是我们分享Github、Gitee等开源社区中优质项目的栏目,包括技术、学习、实用与各种有趣的内容。本期推荐的是一个开源的 HTML5 视频播放器插件&mdash;&mdash;MuiP...【详细内容】
2021-12-16  Tags: HTML  点击:(23)  评论:(0)  加入收藏
此文由掘金@天行天忌授权发布,前端晚间课对其内容进行微改。 HTML,超文本标记语言,是一种用于创建网页的标准标记语言。自从引入 HTML 以来,它就一直用于构建互联网。与 JavaScr...【详细内容】
2021-11-23  Tags: HTML  点击:(326)  评论:(0)  加入收藏
HTML是什么?超文本标记语言(Hyper Text Markup Language),标准通用标记语言下的一个应用。HTML 不是一种编程语言,而是一种标记语言 (markup language),是网页制作所必备的。“...【详细内容】
2021-11-05  Tags: HTML  点击:(40)  评论:(0)  加入收藏
一、iframe标签 自己编写的页面中如果要引用外部的页面的话,可以使用iframe标签来实现。为了更好地理解举个例子,前面几篇中我们都是在index.hmtl中编写代码。如果有个需求是...【详细内容】
2021-11-03  Tags: HTML  点击:(29)  评论:(0)  加入收藏
Web项目开发中视频播放是一个非常常见的需求,需要播放器能够支持pc端和移动端的使用,并且支持常见的视频格式。我们从github上精选了5款优秀的Html5 播放器插件分享给大家。(排...【详细内容】
2021-09-17  Tags: HTML  点击:(101)  评论:(0)  加入收藏
前言在刚接触HTML的时候,你是否被它众多的标签所惊讶?尤其是HTNL5的标签,新增了不少,很多HTML4的标签跨版本之后就用不了了,如此多的标签,要记是不可能记完的,我们只需要一些常用的...【详细内容】
2021-08-27  Tags: HTML  点击:(343)  评论:(0)  加入收藏
我们倾向于使用HTML与CSS、JavaScript等,使我们的网站或博客看起来更有吸引力,但你知道仅HTML就有很多实用的秘密,可能会派上用场,帮助你设计一个华丽的网站?下面是一些很酷的HTM...【详细内容】
2021-08-13  Tags: HTML  点击:(90)  评论:(0)  加入收藏
meta 标签分两大部分:HTTP 标题信息(http-equiv)和页面描述信息(name)。 1、声明文档使用的字符编码<meta charset=&#39;utf-8&#39;>以下设置更为详细:<meta http-equiv="Content-...【详细内容】
2021-08-12  Tags: HTML  点击:(91)  评论:(0)  加入收藏
本节我们讲HTML表单标签,当你在网页输入框提交一个数据,这条数据一般是提交给了服务器,然后服务器根据请求返回你想要的数据,这个你输入信息的输入框或者提交的按钮就是HTML表...【详细内容】
2021-06-25  Tags: HTML  点击:(141)  评论:(0)  加入收藏
同事跟我说他用jQuery取不到页面上隐藏元素input的值,他的html页面大概内容如下。<!DOCTYPE html><html lang="zh"> <head> <meta http-equiv="Content-Type" content="text/...【详细内容】
2021-05-18  Tags: HTML  点击:(220)  评论:(0)  加入收藏
▌简易百科推荐
此文由掘金@天行天忌授权发布,前端晚间课对其内容进行微改。 HTML,超文本标记语言,是一种用于创建网页的标准标记语言。自从引入 HTML 以来,它就一直用于构建互联网。与 JavaScr...【详细内容】
2021-11-23  前端晚间课    Tags:HTML6   点击:(326)  评论:(0)  加入收藏
HTML是什么?超文本标记语言(Hyper Text Markup Language),标准通用标记语言下的一个应用。HTML 不是一种编程语言,而是一种标记语言 (markup language),是网页制作所必备的。“...【详细内容】
2021-11-05  人生三部曲丶    Tags:HTML   点击:(40)  评论:(0)  加入收藏
一、iframe标签 自己编写的页面中如果要引用外部的页面的话,可以使用iframe标签来实现。为了更好地理解举个例子,前面几篇中我们都是在index.hmtl中编写代码。如果有个需求是...【详细内容】
2021-11-03  HillelDu    Tags:html   点击:(29)  评论:(0)  加入收藏
我们倾向于使用HTML与CSS、JavaScript等,使我们的网站或博客看起来更有吸引力,但你知道仅HTML就有很多实用的秘密,可能会派上用场,帮助你设计一个华丽的网站?下面是一些很酷的HTM...【详细内容】
2021-08-13  杭州程序员小张    Tags:HTML   点击:(90)  评论:(0)  加入收藏
meta 标签分两大部分:HTTP 标题信息(http-equiv)和页面描述信息(name)。 1、声明文档使用的字符编码<meta charset=&#39;utf-8&#39;>以下设置更为详细:<meta http-equiv="Content-...【详细内容】
2021-08-12  简易编程    Tags:meta标签   点击:(91)  评论:(0)  加入收藏
本节我们讲HTML表单标签,当你在网页输入框提交一个数据,这条数据一般是提交给了服务器,然后服务器根据请求返回你想要的数据,这个你输入信息的输入框或者提交的按钮就是HTML表...【详细内容】
2021-06-25  科技现象    Tags:HTML   点击:(141)  评论:(0)  加入收藏
背景日常工作中,项目编程免不了需要使用配置文件,早期yaml出现之前,大部分配置文件采用xml形式,但是以xml格式储存的数据要比以其他格式(如json、yaml)储存占有的空间要大得多,因为...【详细内容】
2021-06-21  爱读书的程序员    Tags:yaml   点击:(265)  评论:(0)  加入收藏
XML; 是什么? Extensible Markup Languare 可扩展标记型语言 为什么要有XML? 1.HTML的标签是固定的,不可以改变,也不可以进行一个&middot;&middot;&middot;扩展 2.HTML语法松散...【详细内容】
2021-06-01  LeviT    Tags:XML   点击:(193)  评论:(0)  加入收藏
同事跟我说他用jQuery取不到页面上隐藏元素input的值,他的html页面大概内容如下。<!DOCTYPE html><html lang="zh"> <head> <meta http-equiv="Content-Type" content="text/...【详细内容】
2021-05-18  IT洞察者    Tags:Html   点击:(220)  评论:(0)  加入收藏
HTML5语义化与新特性什么是HTML语义化?表示选择合适的标签(语义化标签)便于开发者阅读和写出更优雅的代码为什么要使用语义化标签?1). 在没有CSS样式的情况下,页面整体也会呈现...【详细内容】
2021-03-02      Tags:HTML   点击:(236)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条