在使用不显眼的验证插件时,如何在keyup和focusout上禁用1个特定html元素的jquery验证?

时间:2014-01-30 07:34:12

标签: javascript jquery javascript-events jquery-validate unobtrusive-validation

默认情况下,jQuery validation plugin附加了focusinfocusoutkeyup个事件的验证处理程序。

我们的一个验证是发出一个(同步)请求来检索一些数据。我希望仅在提交表单时触发验证,而不是在用户键入时触发。

我知道这可能是modified for the whole form,但那不是我想要的。

有没有办法动态禁用1个元素的keyup验证?

更新1
我忘了提到我正在使用unobtrusive validation。所以我认为@Mario Johnathan的答案不是一个选择。

更新2 : 我尝试了以下内容($ element是我想要更改验证行为的元素):

  1. $element.validate({focusout: false, keyup: false});
  2. $element.keyup(function() { return false; });
  3. $element.off('keyup');
  4. $element.unbind('keyup');

6 个答案:

答案 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;
        },