原生js 实现表单验证功能


Posted in Javascript onFebruary 08, 2021

表单验证是web前端最常见的功能之一,也属于前端开发的基本功。自己完成一个表单验证的开发,也有助于加深对字符串处理和正则表达式的理解。

基本的表单验证包括如:字母验证、数字验证、字母和数字验证、汉字验证、密码验证、日期验证、手机验证、邮箱验证,密码验证等。

现在就来完成这些验证代码的编写,先来看字母是怎么验证的。先编写需要的html代码,创建一个id为formContainer的表单元素,在里面加入需要验证英文字母的文本框和按钮,文本框后面需要一个span元素存放提示文字。如下所示:

<form action="" class="form_Box" id="formContainer">
 <dl>
  <dt>英文字母:</dt>
  <dd><input type="text" id="verifyEn"><span></span></dd>
  <dd>
  <input type="submit" value="提交" class="btn submit">
  <input type="reset" value="重置" class="btn reset">
  </dd>
 </dl>
 </form>

开发的时候,一步一步分析功能再去实现,可以保持清晰的思路。

1. 获取表单元素及文本框元素,如下所示:

var eFormContainer = document.getElementById('formContainer');
var eVerifyEn = document.getElementById('verifyEn');

 2. 给表单元素绑定提交事件,用于点击提交按钮时,进行验证。

eFormContainer.addEventListener('submit',function(event){
 
});

本实例要求当通过验证时,弹出提示通过验证;如果验证没有通过时,光标定位到文本框,并在文本框后显示验证失败的提示。接下来看下在提交事件函数中,具体怎么样做。

 3. 先在函数中声明相关变量并获取文本框的值。bPass变量用于判断是否可通过验证;sPrompt变量是提示文字;sValue变量是文本框的值。如下所示:

eFormContainer.addEventListener('submit',function(event){
 var bPass = false;
 var sPrompt = '';
 var sValue = eVerifyEn.value;
});

 4. 不允许文本框为空。判断sValue是不是空字符串,如果是则在文本框后显示提示,并且激活文本框,还需要阻止后续操作和默认行为,代码如下:

eFormContainer.addEventListener('submit',function(){
 /* ... */
 
 if(sValue.trim()==''){
  //修改提示文字
  sPrompt = '英文字母不能为空!';
  //光标定位到字母文本框
  eVerifyEn.focus();
  //在文本框后显示提示文字
  //获取文本框父元素
  let eParent = eVerifyEn.parentElement;
  //获取存放提示的span元素
  let eSpan = eParent.getElementsByTagName('span')[0];
  //在span元素中添加提示
  eSpan.innerHTML = sPrompt;
  //阻止表单提交
  event.preventDefault();
  //阻止后续代码的执行
  return;
 }
 
});

5. 判断输入的值是否符合规则,即只有英文字母没有其他字符。在这里声明一个正则表达式,用于判断是否都是英文字母。如下所示:

eFormContainer.addEventListener('submit',function(){
 /* ... */
 
 //声明正则,并判断字符串是否都是英文字母
 let reg = /^[a-zA-Z]+$/;
 bPass = reg.test(sValue);
 
});

6. 根据正则判断结果,执行通过或阻止提交。

eFormContainer.addEventListener('submit',function(){
 /* ... */
 
 if(bPass){
  //通过验证弹出提示
  alert('通过验证');
 }else{
  //修改提示文字
  sPrompt = '只能输入英文字母!';
  //光标定位到字母文本框
  eVerifyEn.focus();
  //在文本框后显示提示文字
  //获取文本框父元素
  let eParent = eVerifyEn.parentElement;
  //获取存放提示的span元素
  let eSpan = eParent.getElementsByTagName('span')[0];
  //在span元素中添加提示
  eSpan.innerHTML = sPrompt;
  //阻止表单提交
  event.preventDefault();
 }
 
});

7. 在文本框输入内容的时候,应该要删除后面的提示,如下所示:

//在eFormContainer元素上绑定input事件,把所有文本框的input事件都委托给eFormContainer元素,
 // 这样做的好处就是不需要给每一个文本框都添加事件。
 eFormContainer.addEventListener('input',function(event){
 //获取当前文本框
 let eInput = event.target;
 //获取文本框父元素
 let eParent = eInput.parentElement;
 //获取存放提示的span元素
 let eSpan = eParent.getElementsByTagName('span')[0];
 //清空提示
 eSpan.innerHTML = '';
 });

此时的完整javascript代码如下:

function fnFormVerify(){
 // 获取表单元素
 var eFormContainer = document.getElementById('formContainer');
 // 获取验证字母文本框
 var eVerifyEn = document.getElementById('verifyEn');
 // 给表单元素绑定提交事件
 eFormContainer.addEventListener('submit',function(){
  // 声明bPass变量,用于判断是否通过验证
  var bPass = false;
  // 声明sPrompt变量,用于提示文字
  var sPrompt = '';
  // 获取字母文本框的值,保证其不等于空,再判断值中是否包含非英文字母,代码如下:
  var sValue = eVerifyEn.value;
  //保证其不等于空
  if(sValue.trim()==''){
  //修改提示文字
  sPrompt = '英文字母不能为空!';
  //光标定位到字母文本框
  eVerifyEn.focus();
  //在文本框后显示提示文字
  //获取文本框父元素
  let eParent = eVerifyEn.parentElement;
  //获取存放提示的span元素
  let eSpan = eParent.getElementsByTagName('span')[0];
  //在span元素中添加提示
  eSpan.innerHTML = sPrompt;
  //阻止表单提交
  event.preventDefault();
  //阻止后续代码的执行
  return;
  }

  //声明正则,并判断字符串是否都是英文字母
  let reg = /^[a-zA-Z]+$/;
  bPass = reg.test(sValue);
  if(bPass){
  //通过验证弹出提示
  alert('通过验证');
  }else{
  //修改提示文字
  sPrompt = '只能输入英文字母!';
  //光标定位到字母文本框
  eVerifyEn.focus();
  //在文本框后显示提示文字
  //获取文本框父元素
  let eParent = eVerifyEn.parentElement;
  //获取存放提示的span元素
  let eSpan = eParent.getElementsByTagName('span')[0];
  //在span元素中添加提示
  eSpan.innerHTML = sPrompt;
  //阻止表单提交
  event.preventDefault();
  }
 });

 //在eFormContainer元素上绑定input事件,把所有文本框的input事件都委托给eFormContainer元素,
 // 这样做的好处就是不需要给每一个文本框都添加事件。
 eFormContainer.addEventListener('input',function(event){
  //获取当前文本框
  let eInput = event.target;
  //获取文本框父元素
  let eParent = eInput.parentElement;
  //获取存放提示的span元素
  let eSpan = eParent.getElementsByTagName('span')[0];
  //清空提示
  eSpan.innerHTML = '';
 });
 }
 fnFormVerify();

此时效果如图所示:

原生js 实现表单验证功能

随后我们还需要完成数字验证、字母和数字验证、汉字验证、密码验证、日期验证、手机验证、邮箱验证,密码等。如果每一次验证都这么写的话,会很繁琐,而且代码也会比较多。所以需要封装一个字符串验证的函数,返回验证结果。在提交的时候再每一个文本框依次调用。

添加html元素如下:

<form action="" class="form_Box" id="formContainer">
 <dl>
 <dt>英文字母:</dt>
 <dd><input type="text" id="verifyEn"><span></span></dd>
 <dt>英文和数字:</dt>
 <dd><input type="text" id="verifyEnNum"><span></span></dd>
 <dt>数字:</dt>
 <dd><input type="text" id="verifyNum"><span></span></dd>
 <dt>汉字:</dt>
 <dd><input type="text" id="verifyCn"><span></span></dd>
 <dt>日期:</dt>
 <dd><input type="text" id="verifyDate"><span></span></dd>
 <dt>邮箱:</dt>
 <dd><input type="text" id="verifyEmail"><span></span></dd>
 <dt>手机:</dt>
 <dd><input type="text" id="verifyPhone"><span></span></dd>
 <dt>密码:</dt>
 <dd><input type="password" id="verifyPwd"><span></span></dd>
 <dt>确认密码:</dt>
 <dd><input type="password" id="verifyForPwd"><span></span></dd>
 <dt></dt>
 <dd>
  <input type="submit" value="提交" class="btn submit">
  <input type="reset" value="重置" class="btn reset">
 </dd>
 </dl>
</form>

再修改js代码:

1. 获取表单元素和所有文本框,如下所示:

// 获取表单元素
 var eFormContainer = document.getElementById('formContainer');
 // 获取验证字母文本框
 var eVerifyEn = document.getElementById('verifyEn');
 // 获取英文和数字文本框
 var eVerifyEnNum = document.getElementById('verifyEnNum');
 // 获取数字文本框
 var eVerifyNum = document.getElementById('verifyNum');
 // 获取汉字文本框
 var eVerifyCn = document.getElementById('verifyCn');
 // 获取日期文本框
 var eVerifyDate = document.getElementById('verifyDate');
 // 获取邮箱文本框
 var eVerifyEmail = document.getElementById('verifyEmail');
 // 获取手机文本框
 var eVerifyPhone = document.getElementById('verifyPhone');
 // 获取密码文本框
 var eVerifyPwd = document.getElementById('verifyPwd');
 // 获取确认密码文本框
 var eVerifyForPwd = document.getElementById('verifyForPwd');

2.封装一个验证函数,传入三个参数:elem为文本框元素,reg为正则表达式,text为提示关键字。如下所示:

function fnVerify(elem,reg,text){
 //获取文本框输入的字符
 var sValue = elem.value;
 //获取文本框父元素
 let eParent = elem.parentElement;
 //获取存放提示的span元素
 let eSpan = eParent.getElementsByTagName('span')[0];

 //判断文本框字符是否为空
 if(sValue.trim()==''){
 //光标定位到文本框
 elem.focus();
 //在文本框后显示提示文字
 eSpan.innerHTML = text + '不能为空!';
 //返回false
 return false;
 }

 // 判断字符串是否符合规则
 if(reg.test(sValue)){
 //如果符合,返回true
 return true;
 }else{
 //光标定位到文本框
 elem.focus();
 //在文本框后显示提示文字
 eSpan.innerHTML = text + '格式不正确!';
 //不符合则返回false
 return false;
 }
}

3.在表单元素上绑定提交事件,如下所示:

eFormContainer.addEventListener('submit',function(event){
 // 声明bPass变量,用于判断是否通过验证
 var bPass = false;
 
 //逐个验证文本框格式
 bPass = fnVerify(eVerifyEn,/^[a-zA-Z]+$/,'英文字母') &&
   fnVerify(eVerifyEnNum,/^[a-zA-Z0-9]*$/,'英文和数字') &&
   fnVerify(eVerifyNum,/^\d*$/,'数字') &&
   fnVerify(eVerifyCn,/^[\u0391-\uFFE5]+$/,'汉字') &&
   fnVerify(eVerifyDate,/^(\d{2}|\d{4})-\d{1,2}-\d{1,2}$/,'日期') &&
   fnVerify(eVerifyEmail,/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/,'邮箱') &&
   fnVerify(eVerifyPhone,/^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/,'手机') &&
   fnVerify(eVerifyPwd,/^[\w!@#$%^&*?\(\)]{6,16}$/,'密码');

 //确认密码要与密码一致,单独加一个验证
 if(eVerifyPwd.value !== eVerifyForPwd.value){
 //获取确认密码父元素
 let eParent = eVerifyForPwd.parentElement;
 //获取提示span元素
 let eSpan = eParent.getElementsByTagName('span')[0];
 //提示错误
 eSpan.innerHTML = '确认密码要和密码保持一致';
 //激活确认密码输入框
 eVerifyForPwd.focus();
 //阻止后续操作
 bPass = false;
 }

 if(bPass){
 //通过验证弹出提示
 alert('通过验证');
 event.preventDefault(); //实际工作不能有此行,在这里是为了阻止表单默认行为。
 }else{
 //阻止表单提交
 event.preventDefault();
 }
 
});

还有一个问题需要解决,在文本框输入内容的时候,都应该删除后面的提示,不然输入正确还提示错误这不正常。 

4. 在eFormContainer元素上绑定input事件,用于输入时删除提示文字。

eFormContainer.addEventListener('input',function(event){
 //获取当前文本框
 let eInput = event.target;
 //获取文本框父元素
 let eParent = eInput.parentElement;
 //获取存放提示的span元素
 let eSpan = eParent.getElementsByTagName('span')[0];
 //清空提示
 eSpan.innerHTML = '';
});

写到这里,一个完整的表单验证页面基本完成了;本实例教程采用的是submit提交表单事件,而现在的实际开发中,已经很少这样直接提交表单了。特此说明,以免误导读者。

以上就是原生js 实现表单验证功能的详细内容,更多关于js 表单验证的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
学习YUI.Ext基础第一天
Mar 10 Javascript
[HTML/CSS/Javascript]WWTJS
Sep 25 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
Sep 06 Javascript
JS字符串拼接在ie中都报错的解决方法
Mar 27 Javascript
js操作iframe父子窗体示例
May 22 Javascript
JavaScript模板引擎用法实例
Jul 10 Javascript
Vue.js基础知识汇总
Apr 27 Javascript
JavaScript数据类型学习笔记分享
Sep 01 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
Nov 01 Javascript
JavaScript HTML DOM元素 节点操作汇总
Jul 29 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
Nov 26 jQuery
el-table表头根据内容自适应完美解决表头错位和固定列错位
Jan 07 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
Feb 08 #Javascript
JavaScript实现点击出现子菜单效果
Feb 08 #Javascript
深入理解javascript中的this
Feb 08 #Javascript
Vue中使用wangeditor富文本编辑的问题
Feb 07 #Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 #Vue.js
js基于canvas实现时钟组件
Feb 07 #Javascript
nestjs中异常过滤器Exceptionfilter的具体使用
Feb 07 #Javascript
You might like
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
JS 树形递归实例代码
2010/05/18 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
jquery获取一个元素下面相同子元素的个数代码
2014/07/31 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
layui之数据表格--与后台交互获取数据的方法
2019/09/29 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
[44:40]2018DOTA2亚洲邀请赛3月30日 小组赛A组Liquid VS OG
2018/03/31 DOTA
在Python中操作文件之read()方法的使用教程
2015/05/24 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
python简单区块链模拟详解
2019/07/03 Python
python实现静态服务器
2019/09/05 Python
深入了解Python在HDA中的应用
2019/09/05 Python
Python缓存技术实现过程详解
2019/09/25 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
详解移动端HTML5音频与视频问题及解决方案
2018/08/22 HTML / CSS
Canvas 帧动画吃苹果小游戏
2020/08/05 HTML / CSS
英国在线药房:Express Chemist
2019/03/28 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
亲属关系公证书
2014/04/08 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
有限责任公司股东合作协议书
2014/12/02 职场文书
2015秋季开学演讲稿范文
2015/07/16 职场文书
教师信息技术学习心得体会
2016/01/21 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL