JQuery.validate – 仅限模糊的一条规则; 其余的应该是正常的吗?

我已经做了一个小提琴来展示我正在尝试为我的用户ID字段做的简单validation:

  1. 使它成为必需(尽可能积极地validation)
  2. 设置最小长度(尽可能积极地validation)
  3. 设置最大长度(尽可能积极地validation)
  4. 运行AJAX调用以确保用户ID尚不存在( 我只想在模糊时运行它

我没有使用validate() – 远程规则,因为我想返回一个自定义对象而不是一个简单的字符串。 如果可以使用遥控器并且它只调用模糊规则,那么我可以尝试。 (我的所有AJAX响应都遵循设置对象定义。)

HTML

User ID:
(Checking...)

JavaScript的

 var $wizardForm = $("#register-wizard"); var $validator = $wizardForm.validate({ rules: { "User.UserId": { required: true, minlength: 3, maxlength: 125, userIdCheck: true } } }); $("#next").click(function (e) { e.preventDefault(); //do validations before moving onto the next tab in the wizard var $valid = $wizardForm.valid(); if (!$valid) { $validator.focusInvalid(); return false; } }); jQuery.validator.addMethod("userIdCheck", function (value, element) { var validator = this; this.startRequest(element); var $loader = $(".loader.user-id"); $.ajax({ url: "/echo/json/", type: "POST", data:{ json: JSON.stringify({ text: 'some text' }), delay: 1 }, success: function (result) { console.log("result: ") console.log(result); validator.stopRequest(element, true); }, error: function (jqXHR, textStatus, errorThrown) { alert("A server error occurred.\n\n" + textStatus); }, beforeSend: function () { $loader.show(); }, complete: function () { $loader.hide(); } }); return "pending"; }, "The user ID is already in use"); 

这是我的小提琴: http : //jsfiddle.net/eHu35/3/

引用标题“关于模糊的一条规则;其余的应该是正常的吗?”

不,各种触发事件,如onfocusoutonkeyup等,都是在“每场”的基础上触发的。 你不能在一个字段上有一个规则,比如min ,在所有事件上正常触发,而同一个字段的另一个规则,比如remote ,只能由onfocusout触发。 ( 但是,您可以针对不同的字段使用不同的事件 )。

在我看过的关于这个主题的大多数SO线程中,用户将禁用onkeyup以防止不断过早触发remote规则。 例如,在测试重新validation代码时,需要禁用onkeyup ,因为每次发生故障时都会生成新代码。

我遇到了同样的问题,并使用这种方式工作,而不是使用远程方法:

 $.validator.addMethod("userIdCheck", function(value, element, params) { if (event.type == "blur" || event.type == "focusout") { var result; $.ajax({url: "path", async: false, success: function(data){ result = data; }}) return result; } else { return true; } }, "The user ID is already in use"); 

但这不适用于firefox,事件未定义。 所以我修改了源代码(任何人都有另一种方式?):

 function delegate( event ) { var validator = $.data( this[ 0 ].form, "validator" ), eventType = "on" + event.type.replace( /^validate/, "" ), settings = validator.settings; // add event to validator validator.event = event; if ( settings[ eventType ] && !this.is( settings.ignore ) ) { settings[ eventType ].call( validator, this[ 0 ], event ); } } 

然后我们可以这样使用:

 $.validator.addMethod("userIdCheck", function(value, element, params) { var eventType = this.event.type; if (eventType == "blur" || eventType == "focusout") { var result; $.ajax({url: "path", async: false, success: function(data){ result = data; }}) return result; } else { return true; } }, "The user ID is already in use"); 

不够完美,但这是我找到解决这个问题的唯一方法。