好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

表单校验

表单校验

本篇主要介绍使用 JavaScript 进行表单验证。

表单验证并不是 JavaScript 提供的某种特性,而是结合各种特性达到的一种目的,是需求的产物。

所有线上产品的表单几乎都有验证,如 注册 时要求“ 用户名 6-16 位”,验证会由 JavaScript 来完成,通常为了安全性和准确性,服务端会再次做一遍验证。

1. 验证目标

表单用于收集信息,从 HTML 上讲,表单 内容 使用 form 标签 进行包裹。

    < form   action   =  " /login "   >  
     < label  >  
     用户名 :   < input   type   =  " text "   >  
     </ label  >  

     < label  >  
    密码:   < input   type   =  " text "   >  
     </ label  >  

     < div  >  
       < button   type   =  " submit "   >  登入   </ button  >  
     </ div  >  
   </ form  >  
 

这就是 一个 相对简单的表单,其中包含文本框(input 标签 )与按钮(button 标签 ),并使用 form 标签 进行包裹。

利用 form 标签 ,再触发其 submit 事件时,会将表单 内容 收集后提交个体 action 属性 配置的路径。

单其实把 form 标签 去掉,在 页面 上展示的 效果 几乎是一样的。

    < label  >  
   用户名 :   < input   type   =  " text "   >  
   </ label  >  

   < label  >  
  密码:   < input   type   =  " text "   >  
   </ label  >  

   < div  >  
     < button   type   =  " submit "   >  登入   </ button  >  
   </ div  >  ·
 

所以自出现 AJAX 技术后,很多开发者都不再书写 form 标签 ,直接使用其他元素对表单 内容 进行包裹,因为业务上可能不需要使用 form 标签 的特性来提交表单。

其实不论是使用表单,还是不使用表单,表单的验证都是针对所有表单项的,即输入框、单选项、多选项等。

在表单提交之前,需要对写着表单项的 内容 做校验,然后 拦截 提交操作。

2. 获取 表单 内容

获取 表单 内容 ,实际上就是取到表单项对应的 DOM 节点的值。

获取 DOM 节点的方式非常多,前面的章节也有介绍。

    < style  >   
   h3   {  margin-top  :   ;  color  :   #4caf50  ;  } 
    .login    {  width  :  px ;  padding  :  px ;   Box -shadow  :  px px px  rgba  ( , , ,  )  ;  position  :  fixed ;  top  :   ;  left  :   ;  transform  :   translate  ( -, - )  ;  } 
    .form-item    {   dis play  :  flex ;  margin-b ott om  :  px ;  border-b ott om  :  px solid  #ccc  ;  } 
    .form-item   .title    {  width  :  px ;  color  :   #666  ;  font-size  :  px ;  } 
    .form-item   .content    {  flex  :   ;  } 
    .form-item   .content  input   {  width  :   ;  border  :   none ;  padding  :  px px ;  outline  :  none ;  font-size  :  px ;  } 
    .login-btn    {  width  :   ;  border  :   none ;  background-color  :   #4caf50  ;  color  :  white ;  margin-top  :  px ;  outline  :  none ;  height  :  px ;  } 
    .login-btn  :active    {  background-color  :   #2da050  ;  } 
    </ style  >  

   < form   name   =  " login-form "    class   =  " login "   >  
     < h3  >  登入   </ h3  >  
     < label   class   =  " form-item "   >  
       < div   class   =  " title "   >   用户名    </ div  >  
       < div   class   =  " content "   >  
         < input   id   =  " account "    class   =  " account "    name   =  " account "    type   =  " text "   >  
       </ div  >  
     </ label  >  

     < label   class   =  " form-item "   >  
       < div   class   =  " title "   >  密码   </ div  >  
       < div   class   =  " content "   >  
         < input   name   =  " pwd "    type   =  " password "   >  
       </ div  >  
     </ label  >  

     < div  >  
       < button   class   =  " login-btn "    type   =  " submit "   >  登入   </ button  >  
     </ div  >  
   </ form  >  

   < script  >   
   var  account1  =  document .  getElementById  (  'account'  )  ; 
   var  account2  =  document .  getElementsByName  (  'account'  )  ; 
   var  account3  =  document .  getElementsByClassName  (  'account'  )  ; 

   alert  ( account1  ===  account2 [  ]  )  ; 
   alert  ( account1  ===  account3 [  ]  )  ; 

   var  account4  =  document . forms [  'login-form'  ]  [  'account'  ]  ; 

   alert  ( account1  ===  account4 )  ; 

  console .  log  ( document . forms [  'login-form'  ]  . elements )  ; 
    </ script  >  
 

前三种 获取 节点的方式读者都已经熟悉了。

account4 的 获取 方式稍微有点不一样,document.forms 是文档内的表单集合,其可以通过表单的 id 和 form 的 属性 ,取到具体的某个表单。

取到表单后,还可以直接使用表单项的 name 属性 取到对应的表单项,使用 elements 可以取到这个表单下的所有表单项。

3. 校验表单项

获取 到表单项后,就可以对表单项的值做判断了,如密码必须是 6-16 位:

    < style  >   
   h3   {  margin-top  :   ;  color  :   #4caf50  ;  } 
    .login    {  width  :  px ;  padding  :  px ;   Box -shadow  :  px px px  rgba  ( , , ,  )  ;  position  :  fixed ;  top  :   ;  left  :   ;  transform  :   translate  ( -, - )  ;  } 
    .form-item    {   dis play  :  flex ;  margin-b ott om  :  px ;  border-b ott om  :  px solid  #ccc  ;  } 
    .form-item   .title    {  width  :  px ;  color  :   #666  ;  font-size  :  px ;  } 
    .form-item   .content    {  flex  :   ;  } 
    .form-item   .content  input   {  width  :   ;  border  :   none ;  padding  :  px px ;  outline  :  none ;  font-size  :  px ;  } 
    .login-btn    {  width  :   ;  border  :   none ;  background-color  :   #4caf50  ;  color  :  white ;  margin-top  :  px ;  outline  :  none ;  height  :  px ;  } 
    .login-btn  :active    {  background-color  :   #2da050  ;  } 
    </ style  >  

   < form   name   =  " login-form "    class   =  " login "    action   =  " https://imooc.com "   >  
     < h3  >  登入   </ h3  >  
     < label   class   =  " form-item "   >  
       < div   class   =  " title "   >   用户名    </ div  >  
       < div   class   =  " content "   >  
         < input   autocomplete   =  " off "    id   =  " account "    class   =  " account "    name   =  " account "    type   =  " text "   >  
       </ div  >  
     </ label  >  

     < label   class   =  " form-item "   >  
       < div   class   =  " title "   >  密码   </ div  >  
       < div   class   =  " content "   >  
         < input   autocomplete   =  " off "    name   =  " pwd "    type   =  " password "   >  
       </ div  >  
     </ label  >  

     < div  >  
       < button   class   =  " login-btn "    type   =  " submit "   >  登入   </ button  >  
     </ div  >  
   </ form  >  

   < script  >   
   var  loginForm  =  document . forms [  'login-form'  ]  ; 
   var  pwdEle  =  loginForm . pwd ; 

  loginForm .  onsubmit   =   function  ( e )   { 
     var  pwd  =  pwdEle . value ; 

     if   ( pwd . length  <    ||  pwd . length  >   )   { 
       alert  (  '密码长度 6-16'  )  ; 
       return   false  ;   // 可以使用 return e.preventDefault() 代替 
     } 

     setTimeout  (  function  (  )   { 
       alert  (  '登入成功,马上 跳转 !'  )  ; 
     }  ,   )  ; 
   }  ; 
    </ script  >  
 

这里 获取 到了表单元素,同时给表单的事件处理器 属性 onsubmit 赋值,表示在表单被提交的时候做的事情。

在事件处理器中,通过输入框的 value 属性 获取 到了输入的值,对值进行了长度判断,如果长度不正确则返回 false,表单则会终止提交。
如果正确,则会根据 form 标签 的 target 属性 进行提交。

需要注意的是,这里如果使用 addEventListener 来监听 submit 事件,必须使用 preventDefault 来阻止 默 认事件,即阻止表单提交,不能使用 return false; 。

  var  loginForm  =  document . forms [  'login-form'  ]  ; 
 var  pwdEle  =  loginForm . pwd ; 

loginForm .  addEventListener  (  'submit'  ,   function  ( e )   { 
   var  pwd  =  pwdEle . value ; 

   if   ( pwd . length  <    ||  pwd . length  >   )   { 
     alert  (  '密码长度 6-16'  )  ; 
    e .  preventDefault  (  )  ;   // 代替return false 
     return  ; 
   } 

   setTimeout  (  function  (  )   { 
     alert  (  '登入成功,马上 跳转 !'  )  ; 
   }  ,   )  ; 
 }  )  ; 
 

4. 不使用 form 提交表单

不使用 form 标签 来提交表单,通常都是使用 AJAX 进行数据交互的情况。

这个时候就不需要 拦截 form 的提交行为了。

    < style  >   
   h3   {  margin-top  :   ;  color  :   #4caf50  ;  } 
    .login    {  width  :  px ;  padding  :  px ;   Box -shadow  :  px px px  rgba  ( , , ,  )  ;  position  :  fixed ;  top  :   ;  left  :   ;  transform  :   translate  ( -, - )  ;  } 
    .form-item    {   dis play  :  flex ;  margin-b ott om  :  px ;  border-b ott om  :  px solid  #ccc  ;  } 
    .form-item   .title    {  width  :  px ;  color  :   #666  ;  font-size  :  px ;  } 
    .form-item   .content    {  flex  :   ;  } 
    .form-item   .content  input   {  width  :   ;  border  :   none ;  padding  :  px px ;  outline  :  none ;  font-size  :  px ;  } 
    .login-btn    {  width  :   ;  border  :   none ;  background-color  :   #4caf50  ;  color  :  white ;  margin-top  :  px ;  outline  :  none ;  height  :  px ;  } 
    .login-btn  :active    {  background-color  :   #2da050  ;  } 
    </ style  >  

   < div   class   =  " login "   >  
     < h3  >  登入   </ h3  >  
     < label   class   =  " form-item "   >  
       < div   class   =  " title "   >   用户名    </ div  >  
       < div   class   =  " content "   >  
         < input   autocomplete   =  " off "    id   =  " account "    class   =  " account "    name   =  " account "    type   =  " text "   >  
       </ div  >  
     </ label  >  

     < label   class   =  " form-item "   >  
       < div   class   =  " title "   >  密码   </ div  >  
       < div   class   =  " content "   >  
         < input   autocomplete   =  " off "    name   =  " pwd "    type   =  " password "   >  
       </ div  >  
     </ label  >  

     < div  >  
       < button   class   =  " login-btn "    type   =  " button "   >  登入   </ button  >  
     </ div  >  
   </ div  >  

   < script  >   
 var  loginBtn  =  document .  querySelector  (  '.login-btn'  )  ; 
 var  pwdEle  =  document .  querySelector  (  '[name="pwd"]'  )  ; 

 function   login  ( cb )   { 
   // 假装登入花了 1 秒 
   setTimeout  (  function  (  )   { 
     alert  (  '登入成功'  )  ; 
    cb  &&   cb  (  )  ; 
   }  ,   )  ; 
 } 

loginBtn .  addEventListener  (  'click'  ,   function  (  )   { 
   var  pwd  =  pwdEle . value ; 

   if   ( pwd . length  <    ||  pwd . length  >   )   { 
     alert  (  '密码长度 6-16'  )  ; 
     return  ; 
   } 

   login  (  function  (  )   { 
    window . location . href  =   'https://imooc.com'  ; 
   }  )  ; 
 }  )  ; 
    </ script  >  
 

使用这种方式,就可以自主控制流程,不需要再考虑 form 标签 的行为。

5. 小结

校验表单非常常见,校验表单的场景很多时候远没有本篇介绍的这么简单,有时候数据校验的格式非常复杂,需要结合正则、校验算法等方式来 解决 ,如严格的身份证验证就需要结合身份证算法。

但表单的校验总的来说都遵循 获取 表单元素、 获取 表单元素的值、对值进行判断、根据判断结果做下一步动作。

什么是 BOM ? ?自定义事件

查看更多关于表单校验的详细内容...

  阅读:37次

上一篇

下一篇

第1节:什么是 JavaScript    第2节:学习环境准备    第3节:调试方案    第4节:JavaScript 变量    第5节:JavaScript 数据类型    第6节:JavaScript if 语句    第7节:for 语句    第8节:JavaScript 算数运算符    第9节:JavaScript 比较运算符    第10节:JavaScript 逻辑运算符    第11节:JavaScript 函数    第12节:JavaScript 表达式    第13节:JavaScript 对象    第14节:JavaScript 字符串    第15节:JavaScript 数字    第16节:JavaScript 数组    第17节:JavaScript switch 语句    第18节:JavaScript while 语句    第19节:JavaScript 的 break 与 continue    第20节:JavaScript with    第21节:document.cookie    第22节:JavaScript Function    第23节:JavaScript Math    第24节:JavaScript Date    第25节:JavaScript RegExp    第26节:JavaScript JSON    第27节:什么是 DOM    第28节:DOM 和 JavaScript 的关系    第29节:获取和操作 DOM 节点    第30节:DOM 与事件    第31节:DOM 事件绑定    第32节:DOM 事件对象    第33节:DOM 事件流    第34节:事件相关的优化    第35节:自定义事件    第36节:表单校验    第37节:什么是 BOM    第38节:常用的 BOM 相关对象    第39节:BOM 常用属性和方法    第40节:AJAX    第41节:异常处理    第42节:三元运算符    第43节:逗号操作符    第44节:void    第45节:typeof    第46节:delete 操作符    第47节:debugger    第48节:getter & setter    第49节:new 运算符与构造函数    第50节:JavaScript 原型    第51节:JavaScript instanceof    第52节:JavaScript this    第53节:严格模式    第54节:作用域    第55节:闭包    第56节:变量提升    第57节:对象包装器    第58节:Lodash    第59节:moment    第60节:swiper    第61节:ECMAScript 6    第62节:Node.js    第63节:Babel    第64节:CSS 预处理器    第65节:代码规范    第66节:TypeScript    第67节:WebComponents    第68节:Vue、React、Angular    第69节:小程序    第70节:JavaScript 关键字    第71节:分号导致的问题    第72节:对象属性访问问题    第73节:this 使用问题    第74节:浮点数精度问题    第75节:独一无二的 NaN    第76节:避免全局污染    第77节:控制台观察对象问题    第78节:根据环境选择语言特性    第79节:相关资源