多 Select 自定义验证规则
Multi Select Custom Validation Rule
我正在尝试创建自定义验证规则,以确保在具有多重属性的 select 中至少生成一个 selection。我有一个 jsfiddle 显示我此时拥有的内容,但我无法触发验证规则。我已经包含了翻译 select 的 jQuery 脚本,以防万一这可能是我的问题。我的代码在 JavaScript window 底部的文档就绪部分。 jsfiddle 在这里:https://jsfiddle.net/7bkz58cy/25/
$.validator.addMethod('multiSelectRequired', function (value, element) {
return element.length > 0;
}, 'One selection required.');
$('#activity-dialog-form').validate({
rules: {
FacilityList: { multiSelectRequired: true }
}
});
我不明白为什么验证没有触发。有人可以指出我遗漏的内容吗?
在您的自定义验证方法中,您应该检查 value
而不是 element
。
value
可以是 null
(如果为空)或 array
。这样你就可以检查它是否不是 null
:
$.validator.addMethod('multiSelectRequired', function (value, element) {
return value !== null;
}, 'One selection required.');
或者如果您需要多个选择,还要检查 value
数组的长度:
$.validator.addMethod('multiSelectRequired', function (value, element) {
// minimum two options selected:
return value !== null && value.length > 1;
}, 'Two selections required.');
接下来是 <select>
元素最初是隐藏的(用户不可见),因此它在验证过程中被跳过(默认设置)。要使隐藏字段也被验证,请添加 ignore
选项:
$('#activity-dialog-form').validate({
ignore: [],
rules: {
FacilityList: { multiSelectRequired: true }
}
});
还有一点就是定位问题。
最终的方法是将表单放在对话框中,而不是将对话框附加到此处的表单中:
open: function (type, data) {
$(this).parent().appendTo($('#activity-dialog-form'));
// ...
如果出于某种原因需要将其附加到表单,则应禁用对话框覆盖,因为它将位于对话框上方(因为您的表单的 z-index 低于覆盖)。
要禁用覆盖,将 modal
选项更改为 false
(或删除它,因为它默认设置为 false
):
$('#activity-event-dialog').show().dialog({
//modal: false,
I can't figure out why the validation isn't firing.
您的验证不起作用的原因之一是因为您在同一个表单上两次调用 .validate()
方法。您只能调用一次 .validate()
方法,因为所有后续调用都将被完全忽略。由于您的规则是在第二个实例中声明的,因此它们将被忽略。
.validate()
方法只会被调用 一次 ,在 DOM 准备就绪时,初始化表单上的插件,并且同一实例包含任何规则、选项、回调等。
在这个最基本的示例中,我只是将 required
规则 (required="required"
) 放在具有 multiple="multiple"
属性的 select
元素上,验证是在没有自定义的情况下工作 rules/methods:https://jsfiddle.net/csj35fj8/
在您的代码中显示:http://jsfiddle.net/Lzmh0qtg/2/
$('#activity-dialog-form').validate({
ignore: [],
rules: {
FacilityList: {
required: true
}
},
messages: {
FacilityList: {
required: 'One selection required.'
}
}
});
由于您正在使用 .multiselect()
jQuery UI 小部件来动态更改 select 字段的外观,因此您无法再将其验证为原始字段select
元素现已隐藏。
您需要将 ignore
选项设置为 []
以忽略 "nothing",以便验证隐藏的 select
。
为了在用户创建 selection 时自动隐藏验证错误消息,请使用 change
处理程序在该元素上触发 .valid()
方法。
$('.multiselect').on('change', function() {
$(this).valid();
});
需要此解决方法,因为默认情况下 jQuery 验证插件仅查看 original select
元素上的事件,该元素现在是隐藏。
我正在尝试创建自定义验证规则,以确保在具有多重属性的 select 中至少生成一个 selection。我有一个 jsfiddle 显示我此时拥有的内容,但我无法触发验证规则。我已经包含了翻译 select 的 jQuery 脚本,以防万一这可能是我的问题。我的代码在 JavaScript window 底部的文档就绪部分。 jsfiddle 在这里:https://jsfiddle.net/7bkz58cy/25/
$.validator.addMethod('multiSelectRequired', function (value, element) {
return element.length > 0;
}, 'One selection required.');
$('#activity-dialog-form').validate({
rules: {
FacilityList: { multiSelectRequired: true }
}
});
我不明白为什么验证没有触发。有人可以指出我遗漏的内容吗?
在您的自定义验证方法中,您应该检查 value
而不是 element
。
value
可以是 null
(如果为空)或 array
。这样你就可以检查它是否不是 null
:
$.validator.addMethod('multiSelectRequired', function (value, element) {
return value !== null;
}, 'One selection required.');
或者如果您需要多个选择,还要检查 value
数组的长度:
$.validator.addMethod('multiSelectRequired', function (value, element) {
// minimum two options selected:
return value !== null && value.length > 1;
}, 'Two selections required.');
接下来是 <select>
元素最初是隐藏的(用户不可见),因此它在验证过程中被跳过(默认设置)。要使隐藏字段也被验证,请添加 ignore
选项:
$('#activity-dialog-form').validate({
ignore: [],
rules: {
FacilityList: { multiSelectRequired: true }
}
});
还有一点就是定位问题。
最终的方法是将表单放在对话框中,而不是将对话框附加到此处的表单中:
open: function (type, data) {
$(this).parent().appendTo($('#activity-dialog-form'));
// ...
如果出于某种原因需要将其附加到表单,则应禁用对话框覆盖,因为它将位于对话框上方(因为您的表单的 z-index 低于覆盖)。
要禁用覆盖,将 modal
选项更改为 false
(或删除它,因为它默认设置为 false
):
$('#activity-event-dialog').show().dialog({
//modal: false,
I can't figure out why the validation isn't firing.
您的验证不起作用的原因之一是因为您在同一个表单上两次调用 .validate()
方法。您只能调用一次 .validate()
方法,因为所有后续调用都将被完全忽略。由于您的规则是在第二个实例中声明的,因此它们将被忽略。
.validate()
方法只会被调用 一次 ,在 DOM 准备就绪时,初始化表单上的插件,并且同一实例包含任何规则、选项、回调等。
在这个最基本的示例中,我只是将 required
规则 (required="required"
) 放在具有 multiple="multiple"
属性的 select
元素上,验证是在没有自定义的情况下工作 rules/methods:https://jsfiddle.net/csj35fj8/
在您的代码中显示:http://jsfiddle.net/Lzmh0qtg/2/
$('#activity-dialog-form').validate({
ignore: [],
rules: {
FacilityList: {
required: true
}
},
messages: {
FacilityList: {
required: 'One selection required.'
}
}
});
由于您正在使用 .multiselect()
jQuery UI 小部件来动态更改 select 字段的外观,因此您无法再将其验证为原始字段select
元素现已隐藏。
您需要将 ignore
选项设置为 []
以忽略 "nothing",以便验证隐藏的 select
。
为了在用户创建 selection 时自动隐藏验证错误消息,请使用 change
处理程序在该元素上触发 .valid()
方法。
$('.multiselect').on('change', function() {
$(this).valid();
});
需要此解决方法,因为默认情况下 jQuery 验证插件仅查看 original select
元素上的事件,该元素现在是隐藏。