事实证明,Parsley 对单选按钮和复选框有不同的处理方式。CSS 类 .parsley-error 和 .parsley-success 用于装饰,而不是用于从逻辑上识别哪些元素已被验证为有效或无效。
所以: options.errors.classHandler(elem,isRadioOrCheckbox) 被调用以确定哪个元素将接收 .parsley-error 或 .parsley-success CSS 类。除了单选按钮和复选框之外的所有内容的验证决定了谁获得这样的 CSS 类(添加了空格):
this.errorClassHandler =
options.errors.classHandler( element, this.isRadioOrCheckbox )
|| this.$element;
...但是对于单选按钮和复选框,有一个不同的分支,如下所示:
this.errorClassHandler =
options.errors.classHandler( element, this.isRadioOrCheckbox )
|| this.$element.parent();
默认情况下,options.errors.classHandler 是一个空函数,因此它“返回”未定义,对于 rb/cb,您将获得 this.$element.parent(),对于其他所有人,您会获得 this.$element。这就是我得到的。
就我而言,我喜欢在复选框本身上使用默认的错误状态装饰(红色轮廓),并且我还将 CSS 类用于其他验证目的,因此我编写了一个始终返回元素本身的 classHandler 方法.
errors: {
classHandler: function (elem, isRadioOrCheckbox) {
return elem;
}
},
但我还需要在逻辑上识别已被传递为有效的元素,而这并不是 CSS 类的真正用途;你不希望你的字段有效性标志与 UI 美学纠缠在一起。所以另一种(或额外的)方法是添加 onFieldError/onFieldSuccess 监听器。如果您愿意,他们可以根据您的喜好在复选框或单选按钮上设置错误类,但更多的是您还可以引入一些不相关的方法来可访问地识别字段元素是否已经过验证以及它们是通过还是失败 - $(elem).data ('parsleyValid',ParsleyField.isValid()),例如。
listeners: {
onFieldError: function (elem, constraints, ParsleyField) {
// If it's radio/checkbox, Parsley puts these on the parent by default.
if (ParsleyField.isRadioOrCheckbox) {
$(elem).addClass(ParsleyField.options.errorClass)
.removeClass(ParsleyField.options.successClass);
}
$(elem).data('parsleyValid', false);
}
, onFieldSuccess: function (elem, constraints, ParsleyField) {
// If it's radio/checkbox, Parsley puts these on the parent by default.
if (ParsleyField.isRadioOrCheckbox) {
$(elem).addClass(ParsleyField.options.successClass)
.removeClass(ParsleyField.options.errorClass);
}
$(elem).data('parsleyValid', true);
}
}