我有这样的表格:
<form method="post" id="myForm" data-parsley-validate>
<input type="text" name="firstName" id="firstName" required>
<input type="text" name="lastName" id="lastName" required>
<input type="text" name="userName" id="userName"
data-parsley-trigger="focusout"
data-parsley-remote
data-parsley-remote-options='{ "type": "POST" }'
data-parsley-remote-validator='validateName'
required>
<input type="button" id="formSave" name="submit" value="Next">
</form>
脚本:
var userName = $('#userName').parsley();
var _xsrf = $("[name='_xsrf']").val();
$('#myForm').parsley()
.addAsyncValidator('validateName', function(xhr) {
window.ParsleyUI.removeError(userName, 'name-exists');
if (xhr.status == '404') {
window.ParsleyUI.addError(userName, 'name-exists', "Name already exists.");
return 404;
} else if (xhr.status == '200') {
return 200;
}
}, '/validate/?country=' + country + '&_xsrf=' + _xsrf);
如果用户已存在,则会正确显示错误消息,但该字段仍会验证为正确。
在Parsley.js的v1中这样做很容易:/
答案 0 :(得分:1)
我对你的html和js进行了一些更改:
<form method="post" id="myForm">
<input type="text" name="_xsrf" id="_xsrf" value="test">
<input type="text" name="userName" id="userName"
data-parsley-trigger="focusout"
data-parsley-remote
data-parsley-remote-options='{ "type": "POST" }'
data-parsley-remote-validator="validateName"
data-parsley-remote-message="Name already exists."
required>
<!--<input type="button" id="formSave" name="submit" value="Next">-->
<input type="submit" id="formSave" name="formSave" value="Next">
</form>
将submit
设置为按钮的名称并不是一个好主意。查看this answer和this answer。
在您的javascript中,将addAsyncValidator
附加到您的字段而不是表单。至于验证器响应,它必须返回true
false
。如果您希望在获得200
响应时您的字段有效,则必须使用
return xhr.status === 200
如果您认为状态响应为404
时该字段有效,那么您应该使用:
return xhr.status === 404
这是适合我的代码。如果您使用返回404
状态代码的有效网址,则会显示错误,并且不会验证表单。
var _xsrf = $("#_xsrf").val();
var userName = $("#userName").parsley()
.addAsyncValidator('validateName', function (xhr) {
return xhr.status === 200;
}, 'http://localhost/parsley/CheckEmailAvailability.php?_xsrf=' + _xsrf);
$( "#myForm" ).parsley();
$("#myForm" ).submit(function( event ) {
$(this).parsley("validate");
if ($(this).parsley("isValid")) {
console.log('valid');
}
event.preventDefault();
});
有关完整代码,请参阅this jsfiddle。由于您必须执行服务器请求,因此永远不会验证表单(由于Access-Control-Allow-Origin)。但是,如果您使用有效请求在本地测试它,它将起作用。