如何使用jQuery validate手动触发验证?


143

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

我要完成的方案是这样的形式:

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

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


为什么不手动验证呢?该插件对于验证整个表单非常有用,但是在这种情况下,可以手动设置更合适的验证表单。
Anatoliy

在我的示例中,形式主义更大。我要自动化。
usr

Answers:


176

该库似乎允许验证单个元素。只需将click事件与您的按钮相关联,然后尝试以下操作:

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

这里的例子:

https://jqueryvalidation.org/Validator.element


15
这将验证整个表格...仅验证一个字段,正确的方法是:stackoverflow.com/a/12195091/114029
Leniel Maccaferri 2013年

无论出于何种原因,以这种方式进行验证时都不会收到自定义错误文本。可能与我在Durandal对话框中运行有关。在上述情况下,该框架存在很多问题。
P.Brian.Mackey

@Roberto Aloi:不建议使用链接
塞巴斯蒂安

@Sebastian感谢您的ping,现在更新链接!
罗伯托·阿洛伊

113

或者一个可以简单地使用: $('#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/


15
validate()使用此方法检查表单之前,需要在表单上调用它。
GETah 2013年

我有这样的查询if($('#myElem')。val()=='2017-4-12'){日期选择错误} else {有效选择}
srinivas gowda

29

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

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

我的查询if($('#someID)==='2017-4-12){$(“#myform”)。validate()。element(“#i1”)。valid();}否则{$( “ #myform”)。validate()。element(“#i1”)。invalid();}是正确的代码
srinivas gowda

14

文档所述,以编程方式触发表单验证的方法是调用validateator.form()

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

2
这没有回答问题,因为问题仅是关于验证一个特定字段。但这正是我想要的。谢谢!
jlh

4

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

validator.checkForm()

此方法默默地验证返回true / false。它不会触发错误消息。


9
未记录=可能随时中断。
usr

2

上面的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();

1

在类似的情况下,我有自己的验证逻辑,只是想使用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'
  });
});


0

我尝试了它工作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; }
.....
}

3
当问题明确涉及jQuery验证时,此答案假定为.Net环境。
Kenogu Labz 2014年

0

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

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

文档:Validator.element()

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.