2013-01-18 73 views
5

我使用的是非常漂亮的bassistance验证插件为我所有的表单验证需要: http://bassistance.de/jquery-plugins/jquery-plugin-validation/jQuery验证,但仅后首次提交

我遇到一个问题:错误信息立即出现,用户也没有,即使完成了一个领域。因此:直到用户完成打字才会显示无效的电子邮件。

在文档here,一种解决方案是将选项设置onkeyupfalse导致错误消息只出现的onblur。

然而,在我的设置,我遇到的另外两个问题(而不是由上面的解决方案解决)

  1. 在提交无效的形式,错误信息不会被清除纠正他们
  2. 当时使用浏览器自动填充功能,自动填写字段保持标记为错误。

所以,我的第一个问题是:我怎么才能使Bassistance验证火灾后才第一次提交,并从它的默认设置从那里出来?

这里是我的代码:

if($('#contact_form').length) { 
    $("#contact_form").validate({ 
     rules: { 
      first_name: { 
       required: true 
      }, 
      last_name: { 
       required: true 
      }, 
      message: { 
       required: true 
      }, 
      telephone: { 
       required: true 
      },    
      email: { 
       required: true, 
       email: true 
      }, 
      email_again: { 
       required: true, 
       email: true, 
       equalTo: "#email" 
      }, 
      norobot: { 
       required:true, 
       minlength:4, 
       maxlength:4, 
       number:true  
      } 
     } 
    }); 
} 

请在这里找到完整的JavaScript:http://lad.chocolata.be/js/main.js

这里是一个工作示例与臭虫以onkeyup设置为falsehttp://lad.chocolata.be/nl/contact

提交表格后带有一些无效字段时,错误消息在纠正错误时不会清除。

我错过了什么?

+0

请在原始信息中包含您的代码,以便我们重新打开。 – Sparky

+0

嗨,我谦虚地不同意我的问题的结束。代码太大,无法在此完整发布,这就是为什么我已经包含这两个示例的链接。我试图在JSFiddle中重现这种行为,但不能。我猜测我的一些脚本之间有冲突。你可以看看提供的链接吗?尝试提交表单而不填写任何内容,然后更正字段:您将看到错误未被清除。同时,我将把这个问题重写得更加清楚。 – maartenmachiels

+0

这个网站的全部想法还包括帮助未来的读者,这些读者在外部链接失效时不会发生。你可以做的任何事情来创建一个简洁的例子将有助于重新打开它。即使只是简单地把我的简单的jsFiddle和分裂成你的两个案例会更好。 – Sparky

回答

4

报价OP:“所以,简单明了,我的问题是:如何才能让Bassistance确认火灾后,才第一次提交,并用它从那里出来 默认设置”

警告读者:通常情况下,一个会叫.validate()一次在DOM准备初始化形式。下面的代码只会调用.validate()一次当提交按钮被初始按下时...因此,将会有没有验证,直到第一次按下该按钮。

不需要多次拨打.validate(),所以我用了jQuery one() event

$(document).ready(function() { 

    $('#submit').one('click', function() { 
     $('#myform').validate({ 
      // your rules & options 
     }); 
    }); 

}); 

工作演示:

http://jsfiddle.net/hSDyP/

+0

优秀的答案,Sparky。一个问题:我尝试点击提交按钮,并尝试按下输入:这两种情况都起作用。我们是否有覆盖所有可能的情况?或者,使用事件处理程序onsubmit会更好吗? – maartenmachiels

+0

@maartenmachiels,假设启用了JS,那么我会说“是”,你被覆盖了。我会避免使用'submit'事件的任何事情,因为这已经由插件自己的'submitHandler'处理过了。换句话说,你现在还没有真正“提交”,所以没有理由使用这个事件。 – Sparky

+0

胜利者需要一切:-)感谢您的出色贡献。非常感激! – maartenmachiels

-1

我写了一个通用的解决方案,以避免应用valitation直到第一次提交发生。只需使用此代码,包括你的脚本后“jquery.validate.js”:

(function($){ 

var _validate = $.fn.validate; 

$.fn.validate = function(){ 
    var result, args = Array.prototype.slice.apply(arguments); 
    this.each(function(){ 
     var $this = $(this), 
      lazyValidate = $this.data('lazy-validate'); 
     // Lazy validation has been initialized: just delegate 
     if(lazyValidate === true){ 
      result = _validate.apply($this, args); 
      return; 
     } 
     // Init, if not yet 
     if(!lazyValidate){ 
      // Create Lazy Form 
      lazyValidate = $('<form />')[0]; 
      $this.data('lazy-validate', lazyValidate); 
      // Add One-Time submit handlder 
      $this.one('submit.lazy-validate', function(){ 
       var $this = $(this); 
       // Apply validation options now 
       _validate.call($this, $(lazyValidate).data('validator').settings); 
       // Mark lazy validation has initialized 
       $this.data('lazy-validate', true); 
       // Test Valid 
       return $this.valid(); 
      }); 
     } 
     // Apply Method to Lazy Form 
     result = _validate.apply($(lazyValidate), args); 
    }); 
    return result === undefined ? this : result;   
}; 

})(jQuery); 

请记住,如果你使用的字段的方法解决方案是行不通的:规则(),removeAttrs()。最后,我认为这个功能应该作为一个简单的validate()选项包含在valation插件中;但在此之前我仍然会使用这个技巧。

+0

这很漂亮,国际海事组织。与接受的答案相比,有什么优势? – Sparky