jquery validate组件导致表单onsubmit事件执行两次


这是今天在工作中遇到的一个问题。由于业务需要在原来表单提交时增加一段新的校验逻辑。

 

原来的逻辑如下(代码都做了简化):

在表单提交时,使用check方法校验

< form  onsubmit =  "return check();">
 
方法代码:
function  check(){
      if (...){
          alert("xxx");
           return  false ;
     }
}
 
因为新增了一段逻辑,所以我新增了一个方法,调整了代码的结构:
<  form   onsubmit =  "return newCheck();">
方法代码:
  function  newCheck(){
    if (!check()){
      return   false ;
    }
    if (!myCheck(){
      return   false ;
    }
    return   true ;
  }
 
  
  function  myCheck(){
    if (...){
          alert("xxx");
           return   false ;
    }
  }
 
但是当我测试的时候,提示出现了两次。
经过确认,方法执行了两次(这里花了一些功夫确认及了解原因,又去网上找了些相关的资料,但都无效,解决问题都是类似,从未知探索各种可能)。
后来想到页面使用了jquery validate组件做校验,是否和这个有关系呢,当时也是怀疑。
搜索相关内容找到 jQuery.validate 中文API,其中有这样两个字段:
 
问题的原因:onsubmit Boolean 默认:true 是否提交时验证。好吧,就是它导致的。
(刚刚我自己从新看了一遍,我觉得这个方法应该是在提交表单的时候,调用validate,而不是调用validate时执行onsubmit的方法。不管怎样,我觉得query validate还是调用了onsubmit)
 
解决办法:submitHandler:通过验证后运行的函数,里面要加上表单提交的函数,否则表单不会提交。(api后面都有类似如下附加代码片段)
      $( ".selector"  ).validate({
              submitHandler:  function (form) {
               $(form).ajaxSubmit();
              }
           })
好吧,copy过来用。
好吧,表单不提交了(因为上面的代码有问题,及时可以执行,也可能出现下面死循环的问题)。。。继续查找submitHandler的用法。
 
找到了: jquery validate submitHandler 提交导致死循环。写的真不错。正好拿过来用。
 
删除form表单中的onsubmit,然后在jquery validate相关代码内加:
submitHandler: function (form){
             if (newCheck()){
                 form.submit();
            }
         }
问题解决。
 
这是一个遇到未知问题的解决过程,从各个可能的角度去探试。
开始我怀疑是哪里写重复了?
然后怀疑页面顶和底的两个保存按钮的原因?
又去运行线上代码复测这个问题,而且奇怪的是时好时坏,有时执行一次,有时两次。
到此仍然奇怪为什么返回false的时候,我写的代码会执行两次,而原代码执行一次,这里只是多了一层调用。按照顺序的想法代码在第一次false的时候就阻断了。
 
收获2点:
jquery validate 默认会调用onsubmit的方法,导致此方法调用两次,而且在方法返回false时,由于返回了,所以只有一次执行,很难发现校验通过时是执行两次。
jquery方式的表单提交会触发validate执行,所以在validate其内如果再用jquery的表单提交会死循环(验证了),此时应使用dom的提交方式。
 
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM