默认情况下,jQuery validation plugin附加了focusin
,focusout
和keyup
个事件的验证处理程序。
我们的一个验证是发出一个(同步)请求来检索一些数据。我希望仅在提交表单时触发验证,而不是在用户键入时触发。
我知道这可能是modified for the whole form,但那不是我想要的。
有没有办法动态禁用1个元素的keyup验证?
更新1 :
我忘了提到我正在使用unobtrusive validation。所以我认为@Mario Johnathan的答案不是一个选择。
更新2 : 我尝试了以下内容($ element是我想要更改验证行为的元素):
$element.validate({focusout: false, keyup: false});
$element.keyup(function() {
return false;
});
$element.off('keyup');
$element.unbind('keyup');
答案 0 :(得分:5)
我自己处于同一场景中。下面是我用它的代码。
$.validator.setDefaults({
onkeyup: function () {
var originalKeyUp = $.validator.defaults.onkeyup;
var customKeyUp = function (element, event) {
if ($("#your_element")[0] === element) {
return false;
}
else {
return originalKeyUp.call(this, element, event);
}
}
return customKeyUp;
}()
});
这里我所做的是处理该元素的keyup事件,以便验证器不做任何事情。为了休息所有元素,验证器将开始行动。但是这里的问题是,特定元素根本不会对keyup进行验证。
答案 1 :(得分:4)
尝试覆盖onkeyup函数并创建一个可以为每个字段自定义的onkeyup变量
$(#signupForm).validate({
onkeyup: function(element) {
var element_id = $(element).attr('id');
if (this.settings.rules[element_id].onkeyup !== false) {
$.validator.defaults.onkeyup.apply(this, arguments);
}
},
rules: {
myfield: {
required: true,
onkeyup: false
}
}
});
答案 2 :(得分:2)
您可以使用其中一个验证选项。
var validator = $('#form_id').validate({
onfocusout: false,
rules: {...},
messages: {...}
});
答案 3 :(得分:2)
向$元素添加一个新的事件监听器,并使用stopPropagation()阻止事件冒泡DOM树,这将阻止任何父处理程序(包括验证)被通知。
http://api.jquery.com/event.stopPropagation/
$element.on('keyup',function(e){
e.stopPropagation();
});
答案 4 :(得分:0)
到目前为止,我能够通过changing the source code of the jQuery.validation
plugin实现我的目标。
通过将事件(如果有的话)传递给验证方法,我能够检查它是否是从焦点或键盘触发的。
不理想,但工作。
function validateWithSomeLongTakingCallback(source, args, event) {
var shouldTriggerValidation = (!event || (event.type !== 'focusout' && event.type !== 'keyup'));
if (!shouldTriggerValidation) {
args.IsValid = true;
return;
}
...
}
答案 5 :(得分:0)
来自其他论坛:
这仍然是个问题(jQuery 1.7.2和Validation 1.9.0)。我有 创建了一个简单的修复程序,并且还会提交拉取请求。
修复:在“element”函数(第361行)中的jquery.validate.js中添加 这个if语句就像这样的函数顶部(留下一切 否则相同):
element: function( element ) {
//if the element is set to be ignored, don't continue validation
if ( $(element).not(this.settings.ignore).length === 0 ) {
return;
}
element = this.validationTargetFor( this.clean( element ) );
this.lastElement = element;
this.prepareElement( element );
this.currentElements = $(element);
var result = this.check( element ) !== false;
if (result) {
delete this.invalid[element.name];
} else {
this.invalid[element.name] = true;
}
if ( !this.numberOfInvalids() ) {
// Hide error containers on last error
this.toHide = this.toHide.add( this.containers );
}
this.showErrors();
return result;
},