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的提交方式。
 
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。