Jquery 停止自定义验证程序在每次击键时启动

Jquery 停止自定义验证程序在每次击键时启动,jquery,asp.net-mvc,unobtrusive-javascript,Jquery,Asp.net Mvc,Unobtrusive Javascript,我使用MVC数据注释和jQuery低调的javascript库编写了一个自定义验证器。它工作得很好。我现在唯一的问题是,在初始验证之后,如果用户编辑字段,那么每次击键都会触发验证程序。因为验证器点击web服务来验证输入,所以我更希望它总是在用户离开字段或提交表单时验证输入。有没有办法改变这种行为?这是我的密码: <script type="text/javascript"> $.validator.addMethod("validate_zipcode", function

我使用MVC数据注释和jQuery低调的javascript库编写了一个自定义验证器。它工作得很好。我现在唯一的问题是,在初始验证之后,如果用户编辑字段,那么每次击键都会触发验证程序。因为验证器点击web服务来验证输入,所以我更希望它总是在用户离开字段或提交表单时验证输入。有没有办法改变这种行为?这是我的密码:

<script type="text/javascript">
    $.validator.addMethod("validate_zipcode", function (value, element) {
        if (value == null || value.length == 0) {
            return true;
        }

        var isValid = false;
        $.ajax({
            async: false,
            dataType: "json",
            url: "/api/iszipvalid/" + value,
            success: function (response) {
                isValid = response;
            }
        });

        return isValid;
    });

    $.validator.unobtrusive.adapters.addBool('zipcode', 'validate_zipcode');
</script>

$.validator.addMethod(“validate_zipcode”,函数(值,元素){
if(value==null | | value.length==0){
返回true;
}
var isValid=false;
$.ajax({
async:false,
数据类型:“json”,
url:“/api/iszipvalid/”+值,
成功:功能(响应){
isValid=响应;
}
});
返回有效;
});
$.validator.unobtrusive.adapters.addBool('zipcode','validateu zipcode');

您可以在启动新的ajax请求之前取消ajax请求。您的代码可能看起来像:

<script type="text/javascript">
  var request = null;

  $.validator.addMethod("validate_zipcode", function (value, element) {
    if (value == null || value.length == 0) {
        return true;
    }

    if (request != null) {  
      request.abort();
    }

    var isValid = false;
    request = $.ajax({
        async: false,
        dataType: "json",
        url: "/api/iszipvalid/" + value,
        success: function (response) {
            isValid = response;
        }
    });

    return isValid;
  });

  $.validator.unobtrusive.adapters.addBool('zipcode', 'validate_zipcode');
</script>

var请求=null;
$.validator.addMethod(“validate_zipcode”,函数(值,元素){
if(value==null | | value.length==0){
返回true;
}
如果(请求!=null){
request.abort();
}
var isValid=false;
请求=$.ajax({
async:false,
数据类型:“json”,
url:“/api/iszipvalid/”+值,
成功:功能(响应){
isValid=响应;
}
});
返回有效;
});
$.validator.unobtrusive.adapters.addBool('zipcode','validateu zipcode');
如果您查看使用firebug进行的调用,这就是jquery UI autocomplete所做的。

我不确定这将与ASP.NET MVC一起工作(稍后我将启动一个测试项目),但validate允许您对所有validate实例执行以下操作:

$.validator.setDefaults({ onkeyup: false });
如果您可以在MVC获得
validate
句柄之前添加该行,它可能会工作,但它会对所有表单中的所有字段禁用
onkeyup
(根据您的帖子判断,这似乎是可以的)


希望这能有所帮助。

如果我弄错了,请纠正我的错误,但是如果ajax请求已经在进行中,那么这只会取消ajax请求,对吗?它仍将尝试在keyup而不是blur事件上进行验证,但一次只进行一次调用?是的,这是正确的,据我所知,除了通过keyup之外,没有其他方法更改验证。可能值得一看新的Remote属性,它的功能与自定义验证相同,但这也可以通过取消请求来实现。我会使用Remote属性,但在验证的基础上会出现许多其他自定义逻辑(设置其他UI元素)。我也在另一个字段(电子邮件地址——确保它不存在)上实现了这一点,但它在每次击键时都会命中DB。必须有一种方法将事件更改为“blur”而不是“keyup”…request.abort();应为所有ajax驱动的验证添加,以防止早期结果覆盖后期触发器。但是应该避免“request”变量的全局作用域放置,方法是将整个函数封装在一个匿名函数中。看看jqueryvalidate源代码。我这样做了,它仍然在每次按键(或退格)时调用validator方法,但不是在我将标签移出字段时!我还能试什么?