jquery验证器表单:完成远程电子邮件验证后如何访问表单操作

时间:2015-08-13 10:37:06

标签: jquery jquery-validate

历史记录:我之前在this thread中启动了此问题。我花了一些时间试图让远程验证工作,所以我拒绝相信这是导致我悲伤的原因。

现在:我正在使用jQuery Validator,我已将js更新为1.14.0版。这个过程很顺利。所有字段都经过检查和验证,我甚至添加了一些额外的检查来帮助我找出问题:

invalidHandler$("#submitBTN").click(),详情如下。

如果验证失败,这两个选项都会报告回来,并且该按钮还报告通过调用$(form).valid();

来传递验证

我有一个远程验证,它验证电子邮件地址,检查它是否已经在数据库中。这是工作。我使用帖子提交此请求。我应该使用替代技术吗?我这样说是因为验证时表格的帖子没有提交。

我甚至不在submitHandler内进行,但如果我注释掉远程检查,我就可以访问submitHandler并处理表单操作。

我已经审核了jQuery Validation Remote规则,但它的布局非常简单,所以我做错了什么?

这是我的html表单代码:

<form  id="signup_form" name="signup_form"  method="post" action="registration">  
  <h2>E-MAIL ADDRESS</h2>
  <input value="<?=$uEmail?>" type="text" name="signup_email" id="signup_email" /><br />

  <h2>PASSWORD</h2>
  <input type="password" name="requiredpWord" id="requiredpWord"><br />

  <h2>CONFIRM PASSWORD</h2>
  <input type="password" name="requiredcpWord" id="requiredcpWord"><br />

  <button id="submitBTN" type="submit" value="COMPLETE SIGNUP">COMPLETE SIGN UP</button>
</form>

以下是我的jQuery验证(注意我使用console.log&amp; alert混合进行调试):

$(function() {
    $("#signup_form").validate({
        rules: {
            signup_email: {
                email: true,
                required: true,
                remote: { 
                    type: 'post',
                    url: 'registration/isEmailAvailable',
                    data: {
                        email:
                            function() {
                                 // console.log(data);
                                return $( "#signup_email" ).val();
                            }
                    }
                }
            },
            requiredpWord: {
                required: true,
                minlength: 8
            },
            requiredcpWord: {
                equalTo: "#requiredpWord"
            }
        },
       messages: {
            signup_email: {
                required: "Please provide an email",
                email: "Please enter a valid email address"//,
            },
            requiredpWord: {
                required: "Please provide a password.",
                minlength: "Your password must be at least 8 characters long"
            },
            requiredcpWord: "Your passwords do not match."
        },
        invalidHandler: 
            function(form, validator) {
                var errors = validator.numberOfInvalids();
                if (errors) {
                    var message = errors == 1
                    ? 'Please correct the following error:\n'
                    : 'Please correct the following ' + errors + ' errors.\n';
                    var errors = "";
                    if (validator.errorList.length > 0) {
                        for (x=0;x<validator.errorList.length;x++) {
                            errors += "\n\u25CF " + validator.errorList[x].message;
                        }
                    }
                    console.log(message + errors);
                }
                validator.focusInvalid();
            },
        //added this to see if the form would post, did not change it
        submitHandler: 
            function(form) {
                alert("form submitted");
                // do other things for a valid form
                form.submit();
            }
    });
})

这是我的按钮js验证:

$( "#submitBTN" ).click(function() {
  alert( "Valid: " + $("#signup_form").valid() );
});

这是我的简单php验证脚本,在验证表单之后我可以阅读它:

var_dump($_POST);

启用远程部分验证:

当我按提交提醒报告时:

Valid: true

控制台报告电子邮件地址的验证帖子。没有其他事情发生或被报道。该页面仍保留在表单上。

远程部分禁用/已注释的验证:

如果我完全注释掉远程验证部分:

我查看以下警告:

Valid: true&amp;&amp; form submitted

接下来是$ _POST的var_dump。表示表单操作已完成。

我将非常感谢您对如何使其发挥作用的任何建议?!

更新

远程检查几乎返回以下内容:

if(!$userHandler->isEmailAvailable($email)){
    echo json_encode("Email Address is already registered: ".$email);
}else{
    echo false;
}
exit;

如果返回true,则结果将成为错误消息,1。

1 个答案:

答案 0 :(得分:1)

您的服务器端代码看起来应该更像......

if (!$userHandler->isEmailAvailable($email)) {
    // failed validation
    echo json_encode("Email Address is already registered: " . $email); 
} else {
    // passed validation
    echo "true"; 
}
exit;
  

如果返回true,则结果将成为错误消息1

这是因为true是一个布尔值(1),插件期待一个字符串。从字面上看,任何不是"true"(字符串),被视为验证失败,并会给出错误消息:

  • 如果回复为"false"undefinednull,则会收到常规错误消息。

  • 如果回复是"true",那么您已通过验证,并且不会显示任何消息。

  • 如果响应是其他任何内容,则该响应将成为错误消息字符串。