jQuery 验证器在 ajax 调用后针对不再存在的表单元素进行验证
jQuery validator is validating against no longer existing form elements after ajax call
我有一个表单,可以根据用户创建的某些 selection 动态添加或删除输入字段。
基本形式如下所示,经过简化:
<form action="...some/path..." id="MyForm" method="post">
<!-- the first input field is a select list, depending on the selected option, an ajax call will be made to update the div below with new input fields -->
<select name="selectList">
<option>#1</option>
<option>#2</option>
<option>#3</option>
<option>...</option>
</select>
<div id="UpdateThisSection"></div>
<input type="submit" value="Submit">
</form>
根据用户从 select 列表中选择的选项,用户将看到不同的输入字段,这些输入字段呈现在 #UpdateThisSection
div.
选项 #1 的输入字段为:
- 日期字段(必填),因此
required
属性设置为输入字段,以及自定义 data-type="Date"
属性
- 文本(可选),未设置
required
属性
选项 #2 的输入字段为:
- 文本(可选),未设置
required
属性
- 文本(可选),未设置
required
属性
选项 #3 的输入字段为:
- 文本(可选),未设置
required
属性
- 数字(可选),
required
属性集,以及自定义 data-type="Numeric"
属性
jquery验证是这样实现的:
$("#MyForm").validate();
$.validator.addMethod("usDate",
function (value, element) {
return value.match(/^(0?[1-9]|1[0-2])[/., -](0?[1-9]|[12][0-9]|3[0-1])[/., -](19|20)?\d{2}$/);
},
"Please enter a valid date."
);
$("input[data-type='Date']").each(function () {
if ($(this).prop("required")) {
$(this).rules("add",
{
usDate: true
});
}
});
$("input[data-type='Numeric']").each(function () {
$(this).rules("add",
{
number: true
});
});
如果我打开表单并 select 任何选项,验证工作都很好。表单正在按应有的方式进行验证。但是,如果我改变主意并 select 从下拉列表中选择不同的选项,表单将不再正确验证。提交后,我看到该表单正在根据之前表单的要求进行验证。
查看控制台上的 $("#MyForm").validate()
对象,invalid
以及 submitted
属性 仍然保存着以前形式的信息。每当新的 ajax 调用加载新的表单元素时,重置验证器的最简单方法是什么?
我尝试使用 $("#MyForm").validate().resetForm();
重置表单,但它没有清除上述属性。
尝试按照 this Whosebug-post 中的建议清除验证也没有解决我的问题。
What is the easiest way to reset the validator whenever a new ajax call load a new form element?
在Ajaxsuccess
回调中,remove all static rules from an element
$("#MyForm").rules( "remove" );
// Then add or re-add some static rules...
抱歉...无法轻松地为演示重新创建它。
我有一个表单,可以根据用户创建的某些 selection 动态添加或删除输入字段。
基本形式如下所示,经过简化:
<form action="...some/path..." id="MyForm" method="post">
<!-- the first input field is a select list, depending on the selected option, an ajax call will be made to update the div below with new input fields -->
<select name="selectList">
<option>#1</option>
<option>#2</option>
<option>#3</option>
<option>...</option>
</select>
<div id="UpdateThisSection"></div>
<input type="submit" value="Submit">
</form>
根据用户从 select 列表中选择的选项,用户将看到不同的输入字段,这些输入字段呈现在 #UpdateThisSection
div.
选项 #1 的输入字段为:
- 日期字段(必填),因此
required
属性设置为输入字段,以及自定义data-type="Date"
属性 - 文本(可选),未设置
required
属性
选项 #2 的输入字段为:
- 文本(可选),未设置
required
属性 - 文本(可选),未设置
required
属性
选项 #3 的输入字段为:
- 文本(可选),未设置
required
属性 - 数字(可选),
required
属性集,以及自定义data-type="Numeric"
属性
jquery验证是这样实现的:
$("#MyForm").validate();
$.validator.addMethod("usDate",
function (value, element) {
return value.match(/^(0?[1-9]|1[0-2])[/., -](0?[1-9]|[12][0-9]|3[0-1])[/., -](19|20)?\d{2}$/);
},
"Please enter a valid date."
);
$("input[data-type='Date']").each(function () {
if ($(this).prop("required")) {
$(this).rules("add",
{
usDate: true
});
}
});
$("input[data-type='Numeric']").each(function () {
$(this).rules("add",
{
number: true
});
});
如果我打开表单并 select 任何选项,验证工作都很好。表单正在按应有的方式进行验证。但是,如果我改变主意并 select 从下拉列表中选择不同的选项,表单将不再正确验证。提交后,我看到该表单正在根据之前表单的要求进行验证。
查看控制台上的 $("#MyForm").validate()
对象,invalid
以及 submitted
属性 仍然保存着以前形式的信息。每当新的 ajax 调用加载新的表单元素时,重置验证器的最简单方法是什么?
我尝试使用 $("#MyForm").validate().resetForm();
重置表单,但它没有清除上述属性。
尝试按照 this Whosebug-post 中的建议清除验证也没有解决我的问题。
What is the easiest way to reset the validator whenever a new ajax call load a new form element?
在Ajaxsuccess
回调中,remove all static rules from an element
$("#MyForm").rules( "remove" );
// Then add or re-add some static rules...
抱歉...无法轻松地为演示重新创建它。