尝试使用jQuery Remote设置自定义验证消息

时间:2013-08-28 15:48:15

标签: jquery jquery-validate

我有一个带有以下验证设置的表单:

$('#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'));
            }
        }
});

这是尝试做的是使用相同的验证元素(为了与其他框架一起使用)来显示错误和成功方法。

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

当使用远程和模式验证规则的混合时,有没有人知道使用验证错误字段同时成功和错误消息的其他方法?

修改

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

4 个答案:

答案 0 :(得分:7)

您的代码......

$('#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关闭?

DEMO http://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
}

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

DEMO http://jsfiddle.net/xMhvT/1/

请参阅:http://jqueryvalidation.org/valid/

答案 1 :(得分:6)

使用dataFiltermessagesvar 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; } } } }); 参数,如下所示:

export const router: Routes = [
  { path: '', redirectTo: 'index', pathMatch: 'full' },
  { path: 'index', component: Component1 },
  { path: 'page2', component: Component2 },
  { path: 'page3', component: Component3 }
];

答案 2 :(得分:1)

我迟到了回答这个问题,但我认为这可能有助于其他人:

在你的php中只需要添加以下内容

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

并在你的js代码中写下以下内容: $(函数(){

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

});

答案 3 :(得分:0)

dataFilter: function(response) {
                    response = $.parseJSON(response);

                    if (response.status === 'success') return true;
                    else {
                        message = response.error.message;
                        return false;
                    }
                }