添加延迟到jQuery Validator自定义方法

时间:2014-08-14 19:31:50

标签: jquery jquery-mobile jquery-validate

Here is a JSFiddle 将准确显示正在发生的事情。组装需要一段时间,但我从一开始就应该做些什么。

我正在使用jQuery mobile to create an autocomplete list

我正在使用内联验证,因此当用户从一个输入转到另一个输入时,输入将被验证。如果可能,这是我想要维护的功能。

$form.validate({
'rules': {
    'myInput': {
        'required': true,
        'myCustomMethod': true
         }
    },
    'onkeyup': false,
    'onfocusout': function(element) {
        if ($element.attr('id') === 'myInput')
        {
           setTimeout(function() {
             // Just need a way for the input's value to get updated first
             // call my custom method
            }, 1000);
        }
    },
    'submitHandler': function(form) {
        form.submit();
    }
});
...

$.validator.addMethod('myCustomMethod', function(value, element) {
    // myobject is stored values to validate against.
    $.each(myobject, function(i, thing) {
        if (value === thing)
        {
            return true;
        }
        else
        {
            return false;
        }
    });
 }, Messages.inValidInputValue);

myInput 的值必须与自动填充列表中的值匹配。如果没有,则输入应视为无效。

blur元素的myInput事件,myCustomMethod被解雇时。问题是,我将离开该字段以选择由自动完成创建的选项。我很难找到验证onfocusout的方法,但只有在我从列表中选择了一些内容之后。

blur事件和click/touch事件发生在同一时间。其中,是预期的功能。但是,blur事件首先触发,因此当我尝试单击/触摸自动完成列表中的选项时,出现myInput无效的错误。这是真的 - 但我试图选择一个有效的值...

我更新了上面的代码 - 超时帮助显示...我正在尝试做的事情。这就像我需要启动模糊事件,然后等待我点击列表中的项目,然后验证。

但是,用户可能无法从列表中选择一个选项。在这种情况下,输入应被视为无效(这就是我需要模糊事件的原因)。

我已经阅读了return "pending"但我总是得到与return true相同的回复。也许我没有正确地加入它。谢谢你的任何建议!

1 个答案:

答案 0 :(得分:0)

不完全确定您要求的内容,但以下内容可能有效。

1)对一个字段或整个表单禁用onfocusout。不确定您需要什么,因为我看不到您的其余代码。这里的想法是阻止正常事件触发你的领域验证。 (也许您还需要禁用onkeyup验证?)

2)然后,当您准备好验证此特定字段时,您可以使用.valid()方法自行触发它。 $('#myField').valid()将仅触发此一个字段的验证,并返回通过/失败的布尔指示。

请注意,所有规则都应用相同,您仍然需要调用.validate()方法来初始化表单上的插件。


编辑:

基于OP编辑:

onfocusout: function(element) {
    if ($element.attr('id') === 'myInput') {
       setTimeout(function() {
            this.element(element);  // trigger validation after the delay
        }, 1000);
    } else if ( !this.checkable(element) && (element.name in this.submitted || !this.optional(element)) ) {
        this.element(element);  // otherwise, trigger validation normally
    }
},