JQuery validate 插件在验证/校验 表单的时候,是不校验带有readonly,disabled,:reset(type= reset),:submit,:image 等标签的,也就是验证的时候,会过滤掉这些标签的。那如何 让 JQuery validate插件去验证这些标签呢?
JQuery validate Core
首先,看一下JQuery validate 源码中的 elements方法(提取验证元素的方法):
// 图片字太小了,我直接把代码粘贴出来了
elements: function () {
var b = this,
c = {
};
/* *
*我们可以看到此处从input, select, textarea这些标签中,
*以次过滤了 :submit, :reset, :image 这些类型的标签。
*又过滤了带有[disabled], [readonly]属性的标签
*最后又过滤了 我们在 ignore中设置的标签
*/
return a(this.currentForm).find('input, select, textarea').not(':submit, :reset, :image, [disabled], [readonly]').not(this.settings.ignore).filter(function () {
return !this.name && b.settings.debug && window.console && console.error('%o has no name assigned', this),
this.name in c || !b.objectLength(a(this).rules()) ? !1 : (c[this.name] = !0, !0)
})
},
所以,我们在使用的时候,会发现没有验证带有 readonly等属性的标签,尽管我们已经在 标签中添加了 required,maxlength 等属性。
解决方案(仅限 readonly,disabled等属性)
我们不要直接在标签中加入 readonly 等属性,我们使用JS事件,动态处理。
dailyAdd_user绑定 focusin事件,委托在daily_form上, 当焦点落在输入框上时,我们添加上readonly属性设置为true,使用户无法输入,移除时,设置为false。这样validate插件就可以验证了。
// 解决validate 与 readonly 冲突问题
$('#daily_form').on("focusin", "#dailyAdd_user", function() {
$(this).prop('readonly', true);
});
$('#daily_form').on("focusout", "#dailyAdd_user", function() {
$(this).prop('readonly', false);
});
验证效果:
参考博文
How can I enable jquery validation on readonly fields? : http://stackoverflow.com/questions/26838839/how-can-i-enable-jquery-validation-on-readonly-fields