我正在使用MVC 3中的远程验证,但是如果是第二次该字段处于活动状态,它似乎会在我输入内容时触发。问题是我有一个自动完成框,因此他们可能会点击一个结果来填充该字段,MVC将其视为“离开”它。
即使除了自动完成之外,我也不希望它在写作过程中尝试验证。有没有办法可以说“只有在完成输入后n毫秒运行验证”或“仅在模糊时运行验证?”
答案 0 :(得分:19)
MVC 3依赖于jQuery Validation插件进行客户端验证。您需要将插件配置为不在密钥上验证。
您可以使用
全局关闭它$.validator.setDefaults({
onkeyup: false
})
请参阅http://docs.jquery.com/Plugins/Validation/Validator/setDefaults和此处的onkeyup选项http://docs.jquery.com/Plugins/Validation/validate。
答案 1 :(得分:2)
为了将来参考,我发现可以与typeWatch插件(http://archive.plugins.jquery.com/project/TypeWatch)结合使用。
基本上你想做的是(在我的情况下是一个slug):
/*Disable keyup validation on focus and restore it to onkeyup validation mode on blur*/
$("form input[data-val-remote-url]").on({
focus: function () {
$(this).closest('form').validate().settings.onkeyup = false;
},
blur: function () {
$(this).closest('form').validate().settings.onkeyup = $.validator.defaults.onkeyup;
}
});
$(function () {
/*Setup the typeWatch for the element/s that's using remote validation*/
$("#Slug").typeWatch({ wait: 300, callback: validateSlug, captureLength: 5 });
});
function validateSlug() {
/*Manually force revalidation of the element (forces the remote validation to happen) */
var slug = $("#Slug");
slug.closest('form').validate().element(slug);
}
如果您正在使用vanilla typeWatch插件,则必须为每个元素设置typeWatch,因为typeWatch回调不允许您通过$(this)访问当前元素,它只传递值。
或者,您可以修改typeWatch插件以传入元素(timer.el),然后您可以对所有人应用延迟。
答案 2 :(得分:0)
当弹出自动填充建议列表时,我们遇到了自动完成文本框“DealingWithContactName”的问题。在这里,我们选择动态生成的自动完成列表项,用户单击该项目并将焦点设置到该项目。 50分钟后,我们从文本框中取出焦点。它解决了我们的问题。
$('body').on('click', 'ul.ui-autocomplete li a', function () {
$('#DealingWithContactName').focus();
window.setInterval(function () {
$('#DealingWithContactName').blur();
}, 50);
});
答案 3 :(得分:0)
由于某种原因(也许是因为与不引人注目的插件发生冲突),hwiechers的答案对我不起作用。取而代之的是,我必须使用.data('validator')
(如上所述,in this answer)来获取表单的验证器,并在其上将onkeyup
设置为false
。
var validator = $('#form').data('validator');
validator.settings.onkeyup = false;