admin管理员组文章数量:1201993
By default, the jQuery validation plugin is attaching validation handlers for focusin
, focusout
and keyup
events.
1 of our validations is making a (synchronous) request to retrieve some data. I want to have that validation triggered only when the form is being submitted and not while the user is typing.
I know this can be modified for the whole form, but that's not what I'm looking for.
Is there a way to dynamically disable keyup
validation for 1 element?
Update 1:
I forgot to mention that I'm using unobtrusive validation. So I don't think the answer of @Mario Johnathan is not an option.
Update 2:
I tried the following things ($element
is the element on which I want to change the validation behavior):
$element.validate({focusout: false, keyup: false});
$element.keyup(function() { return false; });
$element.off('keyup');
$element.unbind('keyup');
By default, the jQuery validation plugin is attaching validation handlers for focusin
, focusout
and keyup
events.
1 of our validations is making a (synchronous) request to retrieve some data. I want to have that validation triggered only when the form is being submitted and not while the user is typing.
I know this can be modified for the whole form, but that's not what I'm looking for.
Is there a way to dynamically disable keyup
validation for 1 element?
Update 1:
I forgot to mention that I'm using unobtrusive validation. So I don't think the answer of @Mario Johnathan is not an option.
Update 2:
I tried the following things ($element
is the element on which I want to change the validation behavior):
$element.validate({focusout: false, keyup: false});
$element.keyup(function() { return false; });
$element.off('keyup');
$element.unbind('keyup');
6 Answers
Reset to default 6I myself was in the same scenario. Below is the code which I used for it.
$.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;
}()
});
Here what I have done is handle keyup events for that element so that validator doesn't do anything. For rest all elements the validator will kick into action. But the catch here is that particular element will have no validation on keyup at all.
Try overriding the onkeyup function and create an onkeyup variable that you can customize for each field
$(#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
}
}
});
Add a new event listener to the $element and prevent the event bubbling up the DOM tree using stopPropagation(), which will prevent any parent handlers (including validate) being notified.
http://api.jquery.com/event.stopPropagation/
$element.on('keyup',function(e){
e.stopPropagation();
});
You can use one of the validate options.
var validator = $('#form_id').validate({
onfocusout: false,
rules: {...},
messages: {...}
});
Until now I was able to achieve what I need by changing the source code of the jQuery.validation
plugin.
By passing in the event (if any) to the validation methods, I'm able to check if it was triggered from a focusout or a keyup.
Not ideal, but working.
function validateWithSomeLongTakingCallback(source, args, event) {
var shouldTriggerValidation = (!event || (event.type !== 'focusout' && event.type !== 'keyup'));
if (!shouldTriggerValidation) {
args.IsValid = true;
return;
}
...
}
From other forum:
This is still an issue (jQuery 1.7.2 and Validation 1.9.0). I've created a simple fix and will also submit a pull request.
To fix: In jquery.validate.js in the "element" function (line 361) add this if statement to the top of the function like so (leave everything else the same):
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;
},
本文标签:
版权声明:本文标题:javascript - How to disable jquery validation on keyup and focusout for 1 specific html element when using the unobtrusive valid 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1738641221a2104321.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论