2013-08-28 54 views
7

我有以下验证设置的一种形式:尝试设置自定义的验证消息的jQuery远程

$('#form').validate({ 
      onfocusout: false, 
      onkeyup: false, 
      onclick: false, 
      success: function(){ 
       $('#username').addClass('input-validation-confirmation'); 
      } 
     }); 
$('#username').rules("add", { 
     onfocusout: false, 
     onkeyup: false, 
     required: true, 
     email: true,      
     remote: { 
      url: function, 
      type: 'GET', 
      dataType: 'json', 
      traditional: true, 
      data: { 
       username: function() { 
        return $('#username').val(); 
       } 
      }, 
      dataFilter: function (responseString) { 
       var response = jQuery.parseJSON(responseString); 
       currentMessage = response.Message; 
       if (response.State == 0) { 
        currentMessage = currentMessage + 0; 
           return false; 
       } 
       return 'true'; 
      }, 
      beforeSend: function (response) { 
       showLoadingIndicator($('#username')); 
      }, 
      complete: function() { 
       hideLoadingIndicator($('#username')); 
      } 
     } 
}); 

什么,这是试图做的是使用相同的验证元素(为了与其他一些工作框架)显示错误和成功方法。

我的问题是,我的统治的成功方法被炒鱿鱼之前,在远程验证已完成。我尝试了几种方式设置消息,但自定义消息参数似乎没有在验证成功时调用。

是否使用远程和模式验证规则的混合时,任何人都知道的其他方法使用验证错误场成功和错误信息?

编辑:

现在我明白我是在错误的时间期待一个成功的事件。我需要在验证完成后触发的事件(未提交)。有没有这样的事件?

+0

我假设你使用http://jqueryvalidation.org/?如果是这样,它看起来像[远程方法](http://jqueryvalidation.org/remote-method)是基于每个字段的,并且应该是要触发远程检查的字段的子节点。 。 。 – ernie

回答

5

你的代码...

$('#username').rules("add", { 
    onfocusout: false, 
    onkeyup: false, 
    required: true, 
    email: true,      
    remote: { ... }, 
    messages: { ... }, 
    success: function (label) { ... } 
}); 

这里的问题是,onfocusoutonkeyupsuccess不是 “规则”。只有个别“规则”和messages选项可以放在.rules('add')方法的内部。

$('#username').rules("add", { 
    required: true, 
    email: true,      
    remote: { ... }, 
    messages: { 
     remote: "custom remote message" 
    } 
}); 

.rules()方法见文档:http://jqueryvalidation.org/rules

onfocusoutonkeyupsuccess是 “选项”,只有去.validate()方法,其仅附接到<form>元件的内部。

remoteAs per the docs的“自定义”消息而言,此错误消息将自动成为从您的服务器返回的消息......没有特殊设置。


编辑按意见和更新OP:

您的代码:

$('#form').validate({ 
     onfocusout: false, 
     onkeyup: false, 
     onclick: false, 
     success: function(){ 
      $('#username').addClass('input-validation-confirmation'); 
     } 
}); 

你说:“不过,随着更新的代码(见上文)我从来没有看到成功事件。”

您已停用所有的这种形式的活动。触发验证的唯一事件是点击提交按钮。究竟你希望“看到” success断火?

DEMOhttp://jsfiddle.net/xMhvT/

换句话说,submit是唯一的事件留给触发时,您禁用了所有其他事件验证测试。


编辑基于另一个OP更新:

“现在我明白我是在错误的时间期待一个成功的事件我 需要一次验证已经完成了被触发的事件(不提供 ),有没有这样的事件?“

success不是“事件”。 “事件”是一个clickblurkeyup等(onkeyuponfocusoutonclick是控制这个插件的事件选项)

success是“回调函数”。一个“回调函数”是上发生的事件。

•如果您需要一个“回调函数”,每当字段通过验证时触发,则可以使用success

•如果您需要在表单通过验证时触发的“回调函数”,则可以使用submitHandler。但是,这也是表单提交时的情况。

•如果您想要“测试”整个表单或单个字段以查看它是否有效而不提交表单,则可以使用.valid()“方法”。

$('#username').valid(); // for one field 

// or 

$('#form').valid(); // for the whole form 

// you can also... 

if ($('#form').valid()) { 
    //do something if form is valid 
} 

此方法将触发测试(显示消息)并返回一个布尔值。

DEMOhttp://jsfiddle.net/xMhvT/1/

参见:http://jqueryvalidation.org/valid/

+0

是的,那是最古怪的事情。我原本在validate()函数上设置了成功,但根本没有被调用。我把它移到了规则调用中,因为我可以。那是什么时候开始被召唤的。 –

+0

@PaulSachs,也许你在'.validate()'中做了一些其他的错误。 '成功'也是插件核心功能的一部分。当插件运行时,无论您是否声明,“成功”仍将被解雇。否则,除了展示使用此插件及其方法的正确方法外,我不知道还有什么可以帮助您。 – Sparky

+0

@PaulSachs,在'rules()'方法中放入'success'就完全破坏了插件。它是在页面加载和字段无效时触发的:http://jsfiddle.net/9AfLa/ – Sparky

1

我迟到回答这个问题,但我认为它可以帮助别人:

在你的PHP

只需要添加以下

if($rows_matched==1){ 
      echo (json_encode(false)); 
     } 
     else{ 
      echo (json_encode(true)); 
     } 

并在您的js代码中写入以下内容: $(function(){

$('#product_add').validate({ 
rules:{ 
    product_sku:{ 
    remote:{ 
     url:'check.php', 
     type:'POST' 
    } 
    } 
}, 
messages:{ 
    product_sku:{ 
    remote:'already in database' 
    } 
} 
}); 

});

4

使用remotedataFiltermessages参数如下:

var message = 'Default error message'; 

$('form').validate({ 
    rules: { 
     element1: { 
      remote: { 
       url: '/check', 
       type: 'post', 
       cache: false, 
       dataType: 'json', 
       data: { 
        element2: function() { 
         return $('.element2').val(); 
        } 
       }, 
       dataFilter: function(response) { 
        response = $.parseJSON(response); 

        if (response.status === 'success') return true; 
        else { 
         message = response.error.message; 
         return false; 
        } 
       } 
      } 
     } 
    }, 
    messages: { 
     element1: { 
      remote: function(){ return message; } 
     } 
    } 
}); 
相关问题