Javascript 当使用不引人注目的验证插件时,如何对1个特定html元素的keyup和focusout禁用jquery验证?
默认情况下,正在为Javascript 当使用不引人注目的验证插件时,如何对1个特定html元素的keyup和focusout禁用jquery验证?,javascript,jquery,jquery-validate,jquery-events,unobtrusive-validation,Javascript,Jquery,Jquery Validate,Jquery Events,Unobtrusive Validation,默认情况下,正在为focusin、focusout和keyup事件附加验证处理程序 我们的验证之一是发出(同步)请求以检索一些数据。我希望仅在提交表单时触发验证,而不是在用户键入时触发验证 我知道这是可能的,但那不是我想要的 是否有一种方法可以动态禁用1个元素的keyup验证 更新1: 我忘了提到我正在使用。所以我不认为@Mario Johnathan的答案是不可能的 更新2: 我尝试了以下操作($element是我要更改验证行为的元素): $element.validate({focusout
focusin
、focusout
和keyup
事件附加验证处理程序
我们的验证之一是发出(同步)请求以检索一些数据。我希望仅在提交表单时触发验证,而不是在用户键入时触发验证
我知道这是可能的,但那不是我想要的
是否有一种方法可以动态禁用1个元素的keyup
验证
更新1:我忘了提到我正在使用。所以我不认为@Mario Johnathan的答案是不可能的 更新2: 我尝试了以下操作(
$element
是我要更改验证行为的元素):
$element.validate({focusout:false,keyup:false})代码>
$element.keyup(函数(){return false;})代码>
$element.off('keyup')代码>
$element.unbind('keyup')代码>
尝试重写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
}
}
});
直到现在,我才能够通过以下方式实现我所需要的 通过将事件(如果有)传递给验证方法,我能够检查它是否是由focusout或keyup触发的 不是很理想,但很有效
function validateWithSomeLongTakingCallback(source, args, event) {
var shouldTriggerValidation = (!event || (event.type !== 'focusout' && event.type !== 'keyup'));
if (!shouldTriggerValidation) {
args.IsValid = true;
return;
}
...
}
您可以使用其中一个验证选项
var validator = $('#form_id').validate({
onfocusout: false,
rules: {...},
messages: {...}
});
向$element添加一个新的事件侦听器,并使用stopPropagation()防止事件在DOM树中冒泡,这将防止通知任何父处理程序(包括validate) 来自其他论坛: 这仍然是一个问题(jQuery 1.7.2和Validation 1.9.0)。我已经 创建了一个简单的修复程序,并将提交一个请求 要修复:在jquery.validate.js中的“element”函数(第361行)中添加 将if语句放在函数顶部,如下所示(保留所有内容 除此之外(同上):
我自己也有同样的情况。下面是我使用的代码
$.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进行验证。我认为这不是我的选择,因为我使用的是非侵入性验证,初始化是在非侵入性验证插件中完成的。你能想到其他选项吗?sry,但这改变了整个表单的情况,而不仅仅是一个元素,对吗?是的是整个表单,现在不会检查用户何时离开输入。只有当他提交表单时,我的问题是“有没有办法动态禁用1个元素的密钥验证?”。。所以不是整个表单:)对不起!我不明白,我的错!非常感谢。看来这确实是一个正确的方法。我终于可以继续工作了。一定要让我知道它是否适合你。虽然我已经提交了很长一段时间的答案,我会很高兴如果它有帮助。
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;
},
$.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;
}()
});