12

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

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

4 回答 4

12

像这样使用remote,dataFiltermessages参数:

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; }
        }
    }
});
于 2017-06-27T15:22:30.803 回答
10

你的代码...

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

这里的问题是onfocusoutonkeyup并且success不是“规则”。只有单独的“规则”和messages选项可以放在.rules('add')方法中。

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

.rules()有关方法 ,请参阅文档:http: //jqueryvalidation.org/rules

onfocusout,onkeyup并且success是仅进入方法内部的“选项”,该.validate()方法仅附加到<form>元素。

至于“自定义”消息remote根据文档,此错误消息将自动成为从您的服务器返回的消息......没有特殊设置。


根据评论和更新的 OP 进行编辑:

你的代码:

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

你说, “不过,使用更新的代码(见上文)我从未看到成功事件。”

您已禁用此表单上的所有事件。触发该字段验证的唯一事件是单击提交按钮时。您希望什么时候“看到”success

演示:http: //jsfiddle.net/xMhvT/

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


基于另一个 OP 更新的编辑:

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

success不是“事件”。“事件”是一个click, blur,keyup等(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
}

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

演示:http: //jsfiddle.net/xMhvT/1/

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

于 2013-08-28T16:29:32.167 回答
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'
  }
}
});

});

于 2016-10-13T08:02:08.997 回答
0
dataFilter: function(response) {
                    response = $.parseJSON(response);

                    if (response.status === 'success') return true;
                    else {
                        message = response.error.message;
                        return false;
                    }
                }
于 2019-03-04T02:39:23.407 回答