Jquery 停止自定义验证程序在每次击键时启动
我使用MVC数据注释和jQuery低调的javascript库编写了一个自定义验证器。它工作得很好。我现在唯一的问题是,在初始验证之后,如果用户编辑字段,那么每次击键都会触发验证程序。因为验证器点击web服务来验证输入,所以我更希望它总是在用户离开字段或提交表单时验证输入。有没有办法改变这种行为?这是我的密码: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
<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方法,但不是在我将标签移出字段时!我还能试什么?