我正在尝试执行以下操作: 我有一个使用jQuery Validation Plugin验证的表单。有一个领域有几个规则:
var validator = $("#myForm").validate({
rules: {
emailForRequest: {
required: true,
email: true,
remote: "'emailcheck.php"
}
} ,
...
现在,当其中一条规则被破坏时,更确切地说是远程规则,我想触发一些额外的代码。因此,如果远程规则返回错误并且它的错误标签出现在emailForRequest字段旁边,我需要一个回调来在后台执行其他一些操作。
简而言之:我可以看到哪个规则会触发错误,我会在代码中看到它,并附加一个额外函数的执行吗?
修改 好的,感谢Liam的回答以及我对此手册的更好阅读:
rules: {
emailForRequest: {
required: true,
email: true,
remote: {
url: "'emailcheck.php" ,
type: "post" ,
complete: function(data){
if( data.responseText != "true" ) {
alert("Sorry mate, this email address was registered but never activated!");
}
}
}
}
} , ...
但仍存在一个问题。 emailcheck.php脚本可以返回3个不同的结果,其中一个是真的,另外两个是依赖于语言的。所以我想发送一个json对象作为响应,其中包含错误类型的var(在所有语言中都相同)和带有消息的var(已转换)。所以,在我的完整函数中,我可以检查错误类型并根据它做出响应。很容易,除了它会搞砸我应该出现在我的字段旁边的验证标准错误,我还没有找到解决方案。
答案 0 :(得分:7)
不确定此线程是否仍处于打开状态,但我能够通过addMethod
调用解决此问题,并使用数组来跟踪该表单元素的错误消息。
这是代码
//phone
var phoneStatus = null;
$.validator
.addMethod(
'validatePhone',
function()
{
$.ajax({
url: /path/to/script,
async: false,
dataType: 'json',
data:{ formDataHere},
success: function(data)
{
errorMessages['validatePhone'] = data.message;
phoneStatus = data.status;
},
complete: function(){},
error: function(){}
});
return phoneStatus;
},
function()
{
return errorMessages['validatePhone'];
}
);
答案 1 :(得分:1)
现在我有适当的时间阅读手册,试试这个
var validator = $("#myForm").validate({
rules:
{
emailForRequest:
{
required: true,
email: true,
remote: "emailcheck.php"
}
},
messages:
{
emailForRequest:
{
remote: jQuery.format("{0}")
}
}
});
答案 2 :(得分:1)
jquery.validate.js - 第941行:
success: function(response) {
validator.settings.messages[element.name].remote = previous.originalMessage;
var valid = response === true;
if ( valid ) {
....
我认为你可以很容易地在这里插入你自己的功能。您同时拥有响应和元素名称,因此使用特定名称定位元素相当容易。如果您不想修改脚本本身(即从CDN服务器加载),您可以根据原始脚本编写自己的远程验证规则。
除此之外,AFAIK还没有内置函数/方法可以返回未验证的规则名称。
<强>更新强>
找到规则和触发它的元素的解决方法是在errorPlacement
函数中处理它:
...
},
errorPlacement: function(error, element) {
error.insertBefore(element); // default positioning
if ((error == 'your error message') && (element.attr('id') == 'your_targets_id')) {
// your function
}
},
...
希望这有帮助。
答案 3 :(得分:0)
感谢FreekOne和他对前缀的想法,我找到了一个可行的解决方案。我说可行,因为我对它的清洁度不是很满意。由于我不确切知道在验证器中发生了什么,并且修改了dataFilter并且ajax调用的成功功能中断了验证器的正常工作,因此我使用“隐藏”前缀来到以下解决方案:
var validator = $("#myForm").validate({
rules: {
emailForRequest: {
required: true,
email: true,
remote: {
url: "emailcheck.php" ,
type: "post" ,
complete: function(data){
if( data.responseText != true ) {
if( data.responseText.search(/validationErrorTag/) > 0 &&
data.responseText.search(/inactive/) > 0 ) {
inactiveFunctionality();
}
}
}
}
}
} ,...
虽然emailcheck.php返回json编码为true,如果所有内容都检出或json编码的错误消息,如
<span class="validationErrorTag">inactive</span>This address is not yet activated.
最后,我的css文件中有一个条目,以确保前缀不显示:
.validationErrorTag {
display: none;
}
就像我说的,它可行,我现在将使用它,但使用隐藏的html前缀来识别错误消息对我来说似乎有点粗糙。所以,如果有人知道更好的解决方案,请告诉我。
答案 4 :(得分:0)
var validator = $("#myForm").validate({
rules: {
emailForRequest: {
required: true,
email: true,
remote: {
url: "emailcheck.php" ,
type: "post" ,
complete: function(data){
if( data.responseText != true ) {
var type = data.responseText.split('|');
if(type[0]=='inactive') {
inactiveFunctionality();
// type[1] contains your message, display it using any method! e.g. $('#id').html(type[1]); or sooo!
}
}
}
}
}
}
*或**
你可以用json!只需以json格式发送响应文本,并根据“。”进行检查。财产准入。