Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当使用不引人注目的验证插件时,如何对1个特定html元素的keyup和focusout禁用jquery验证?_Javascript_Jquery_Jquery Validate_Jquery Events_Unobtrusive Validation - Fatal编程技术网

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;
          }()
      });