【发布时间】:2014-08-18 02:51:31
【问题描述】:
在 jquery.validate.unobtrusive 中覆盖 ErrorPlacement 函数的正确方法是什么?
查看 jquery.validate.unobtrusive.js 脚本,开发人员的意图似乎是允许您通过设置 $jQval.unobtrusive.options 来应用自己的 ErrorPlacement 函数。
在定义errorPlacement函数的validationInfo(form)函数中,我们看到了对execInContext("errorPlacement", arguments)的调用。
似乎如果我们在 $.validator.unobtrusive.options 下创建一个 errorPlacement 函数,那么它就会被调用。
$.validator.unobtrusive.options = {
errorPlacement: function () {
console.log("hello");
}
};
问题是这必须在 jquery.validate.js 之后和 jquery.validate.unobtrusive.js 被引用之前配置。否则 $jQval.unobtrusive.options 为 null 并且 $form.data(data_validation, result) 将不会被再次设置。
function validationInfo(form) {
var $form = $(form),
result = $form.data(data_validation),
onResetProxy = $.proxy(onReset, form),
defaultOptions = $jQval.unobtrusive.options || {},
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
}
if (!result) {
result = {
options: { // options structure passed to jQuery Validate's validate() method
errorClass: defaultOptions.errorClass || "input-validation-error",
errorElement: defaultOptions.errorElement || "span",
errorPlacement: function () {
onError.apply(form, arguments);
execInContext("errorPlacement", arguments);
},
invalidHandler: function () {
onErrors.apply(form, arguments);
execInContext("invalidHandler", arguments);
},
messages: {},
rules: {},
success: function () {
onSuccess.apply(form, arguments);
execInContext("success", arguments);
}
},
attachValidation: function () {
$form
.off("reset." + data_validation, onResetProxy)
.on("reset." + data_validation, onResetProxy)
.validate(this.options);
},
validate: function () { // a validation function that is called by unobtrusive Ajax
$form.validate();
return $form.valid();
}
};
$form.data(data_validation, result);
}
return result;
}
解决这个问题的另一种方法是
设置$.validator.unobtrusive.options错误放置函数
移除不显眼的验证
-
重新应用不显眼的验证
$.validator.unobtrusive.options = { errorPlacement: function () { console.log("errorPlacement"); } }; $("#form_selector").removeData("unobtrusiveValidation"); // reapply the form's validator $.validator.unobtrusive.parse(document);
或者另一种选择是覆盖函数调用。
var validator = $("#form_selector").data('validator');
var originalFunction = validator.settings.errorPlacement;
validator.settings.errorPlacement = function(error,element) {
console.log("errorPlacement");
originalFunction(error, element);
};
哪种是实现您自己的 errorPlacement 方法的正确方法?
【问题讨论】:
-
不认为你已经解决了这个问题(甚至还记得)?
-
我现在不记得了。在我的帖子结束时,我建议了两种解决问题的方法。我想我可能已经完成了函数调用的覆盖。我觉得它更干净。
标签: jquery unobtrusive-validation