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

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

我正在使用jQuery mobile创建自动完成列表 。

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

$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的值必须与自动完成列表中的值匹配。 如果没有,则输入应视为无效。

myInput元素的blur事件时, myCustomMethod被触发。 问题是,我将离开该字段以选择由自动完成创建的选项。 我正在努力寻找一种方法来validationonfocusout ,但只有在我从列表中选择了一些内容之后。

blur事件和click/touch事件在同一时间发生。 哪个,是预期的function。 但是, blur事件首先触发,因此当我尝试单击/触摸自动完成列表中的选项时,我收到myInput无效的错误。 这是真的 – 但我正在尝试选择一个有效的值…

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

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

我已经读过我可以return "pending"但我总是得到相同的响应,因为return true 。 也许我没有正确地加入它。 谢谢你的任何建议!

不完全确定你要问的是什么,但以下可能有用。

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

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

请注意,所有规则都应用相同,您仍然需要调用.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 } },