【问题标题】:How to manually trigger validation with jQuery validate?如何使用 jQuery validate 手动触发验证?
【发布时间】:2009-09-25 19:50:07
【问题描述】:

我想手动触发验证,包括使用jQuery Validate 显示错误消息。

我想要完成的场景是这样的:

<form>
 <input id=i1> <button id=b1>
 <input id=i2> <button id=b2>
</form>

单击b1 时,仅应验证i1。如果单击b2,则仅应验证i2。但是,必须发布所有字段。我怎样才能做到这一点?我考虑过处理b1/b2 的点击事件并手动验证表单的一部分。

【问题讨论】:

  • 为什么不手动验证呢?这个插件对于验证整个表单非常有用,但在这种情况下更适合手动验证表单。
  • 表格比我的例子大。我希望它自动化。

标签: javascript jquery html jquery-validate


【解决方案1】:

该库似乎允许验证单个元素。只需将点击事件关联到您的按钮并尝试以下操作:

$("#myform").validate().element("#i1");

这里的例子:

https://jqueryvalidation.org/Validator.element

【讨论】:

  • 这会验证整个表单...只验证1个字段,正确的方法是:stackoverflow.com/a/12195091/114029
  • 无论出于何种原因,当我以这种方式验证时,我都没有收到自定义错误文本。可能与我在 Durandal 对话框中运行的事实有关。在上述情况下,这个框架有很多问题。
  • @Roberto Aloi:链接已弃用
【解决方案2】:

或者可以简单地使用:$('#myElem').valid()

if ($('#myElem').valid()){
   // will also trigger unobtrusive validation only for this element if in place 
   // add your extra logic here to execute only when element is valid
}

注意validate()在使用该方法检查之前需要在表单上调用。

文档链接: https://jqueryvalidation.org/valid/

【讨论】:

  • validate() 需要在表单上调用,然后才能使用此方法进行检查。
  • 我有这样的查询 if ($('#myElem').val()=='2017-4-12'){ 日期选择错误 }else{ 有效选择}
【解决方案3】:

我的方法如下。现在我只想在单击/更改一个特定复选框时验证我的表单:

$('#myForm input:checkbox[name=yourChkBxName]').click(
 function(e){
  $("#myForm").valid();
}
)

【讨论】:

  • 我的查询 if($('#someID)==='2017-4-12){ $("#myform").validate().element("#i1").valid ();} else { $("#myform").validate().element("#i1").invalid();} 代码正确
【解决方案4】:

正如the documentation 中所写,以编程方式触发表单验证的方法是调用validator.form()

var validator = $( "#myform" ).validate();
validator.form();

【讨论】:

  • 这不能回答问题,因为问题是关于仅验证一个特定字段。但这正是我想要的。谢谢!
【解决方案5】:

从 1.14 版开始有一个未记录的方法

validator.checkForm()

此方法静默验证是否返回真/假。它不会触发错误消息。

【讨论】:

  • 未记录 = 可能随时中断。
【解决方案6】:

上面的 Eva M,几乎得到了上面发布的答案(感谢 Eva M!):

var validator = $( "#myform" ).validate();
validator.form();

这几乎是答案,但它会导致问题,即使是截至 2018 年 12 月 13 日的最新 jquery 验证插件。问题是,如果直接复制该样本,并且 EVER 调用“.validate()”不止一次,验证的焦点/关键处理可能会被破坏,验证可能无法正确显示错误。

以下是如何使用 Eva M 的答案,并确保不会发生这些焦点/键/错误隐藏问题:

1) 将您的验证器保存到变量/全局变量中。

var oValidator = $("#myform").validate();

2) 不要再调用 $("#myform").validate() 了。

如果您多次调用 $("#myform").validate(),可能会导致焦点/键/错误隐藏问题。

3) 使用变量/全局和调用形式。

var bIsValid = oValidator.form();

【讨论】:

    【解决方案7】:

    在我的类似案例中,我有自己的验证逻辑,只是想使用 jQuery 验证来显示消息。这就是我所做的。

    //1) Enable jQuery validation
    var validator = $('#myForm').validate();
    
    $('#myButton').click(function(){
      //my own validation logic here
      //.....
      //2) when validation failed, show the error message manually
      validator.showErrors({
        'myField': 'my custom error message'
      });
    });

    【讨论】:

      【解决方案8】:

      我试过了,tnx @Anastasiosyal 我想在这个线程上分享它。

      我不确定当我清空字段时输入字段如何没有触发。但我设法使用以下方法单独触发每个必填字段:

      $(".setting-p input").bind("change", function () {
              //Seven.NetOps.validateSettings(Seven.NetOps.saveSettings);
              /*$.validator.unobtrusive.parse($('#saveForm'));*/
              $('#NodeZoomLevel').valid();
              $('#ZoomLevel').valid();
              $('#CenterLatitude').valid();
              $('#CenterLongitude').valid();
              $('#NodeIconSize').valid();
              $('#SaveDashboard').valid();
              $('#AutoRefresh').valid();
          });
      

      这是我的看法

      @using (Html.BeginForm("SaveSettings", "Settings", FormMethod.Post, new {id = "saveForm"}))
      {
          <div id="sevenRightBody">
              <div id="mapMenuitemPanel" class="setingsPanelStyle" style="display: block;">
                  <div class="defaultpanelTitleStyle">Map Settings</div>
                  Customize the map view upon initial navigation to the map view page.
                  <p class="setting-p">@Html.LabelFor(x => x.NodeZoomLevel)</p>
                  <p class="setting-p">@Html.EditorFor(x => x.NodeZoomLevel) @Html.ValidationMessageFor(x => x.NodeZoomLevel)</p>
                  <p class="setting-p">@Html.LabelFor(x => x.ZoomLevel)</p>
                  <p class="setting-p">@Html.EditorFor(x => x.ZoomLevel) @Html.ValidationMessageFor(x => x.ZoomLevel)</p>
                  <p class="setting-p">@Html.LabelFor(x => x.CenterLatitude)</p>
                  <p class="setting-p">@Html.EditorFor(x => x.CenterLatitude) @Html.ValidationMessageFor(x => x.CenterLatitude)</p>
                  <p class="setting-p">@Html.LabelFor(x => x.CenterLongitude)</p>
                  <p class="setting-p">@Html.EditorFor(x => x.CenterLongitude) @Html.ValidationMessageFor(x => x.CenterLongitude)</p>
                  <p class="setting-p">@Html.LabelFor(x => x.NodeIconSize)</p>
                  <p class="setting-p">@Html.SliderSelectFor(x => x.NodeIconSize) @Html.ValidationMessageFor(x => x.NodeIconSize)</p>
              </div>
      

      和我的实体

         public class UserSetting : IEquatable<UserSetting>
          {
              [Required(ErrorMessage = "Missing Node Zoom Level.")]
              [Range(200, 10000000, ErrorMessage = "Node Zoom Level must be between {1} and {2}.")]
              [DefaultValue(100000)]
              [Display(Name = "Node Zoom Level")]
              public double NodeZoomLevel { get; set; }
      
              [Required(ErrorMessage = "Missing Zoom Level.")]
              [Range(200, 10000000, ErrorMessage = "Zoom Level must be between {1} and {2}.")]
              [DefaultValue(1000000)]
              [Display(Name = "Zoom Level")]
              public double ZoomLevel { get; set; }
      
              [Range(-90, 90, ErrorMessage = "Latitude degrees must be between {1} and {2}.")]
              [Required(ErrorMessage = "Missing Latitude.")]
              [DefaultValue(-200)]
              [Display(Name = "Latitude")]
              public double CenterLatitude { get; set; }
      
              [Range(-180, 180, ErrorMessage = "Longitude degrees must be between {1} and {2}.")]
              [Required(ErrorMessage = "Missing Longitude.")]
              [DefaultValue(-200)]
              [Display(Name = "Longitude")]
              public double CenterLongitude { get; set; }
      
              [Display(Name = "Save Dashboard")]
              public bool SaveDashboard { get; set; }
      .....
      }
      

      【讨论】:

      • 当问题明确涉及 jQuery 验证时,此答案假定为 .Net 环境。
      【解决方案9】:

      如果您在表单上使用带有参数的validate() 并希望之后手动验证表单的一个字段,这是一个好方法:

      var validationManager = $('.myForm').validate(myParameters);
      ...
      validationManager.element($(this));
      

      文档:Validator.element()

      【讨论】:

        猜你喜欢
        • 2020-02-29
        • 1970-01-01
        • 1970-01-01
        • 2011-11-24
        • 1970-01-01
        • 1970-01-01
        • 2015-04-26
        • 1970-01-01
        相关资源
        最近更新 更多