试图想象一个半复杂的表单提交

时间:2011-03-10 21:06:02

标签: jquery forms

我有一个表单供用户更改其设置。它有5个字段 - 名字,姓氏,密码,确认密码和电子邮件地址。

唯一的问题是我必须确保密码匹配并且电子邮件是有效的。用户可以使用任何或所有字段。

我的头脑中的可能性是:

  • 所有字段中的文字,密码匹配,电子邮件有效 - >提交
  • 仅以名字开头的文字 - >提交
  • 仅使用姓氏的文字 - >提交
  • 两个名称中的文字 - >提交
  • 仅限电子邮件中的文字 - >提交
  • 仅限电子邮件和名字的文字 - >提交
  • 仅限电子邮件和姓氏的文字 - >提交
  • 电子邮件中的文字无效 - >显示无效错误,请勿提交
  • 密码字段中的文字不匹配 - >显示不同的无效错误,请勿提交

我正在使用jQuery来处理所有这些。到目前为止,这是我的代码:

$('#success').hide();
    $('#pwerror').hide();

    $('#subSet').live('click',function() {
        //if any of the fields have a value
        if($("#chfn").val() != "" || $("#chln").val() != "" || $("#chpw").val() != "" || $("#chpw2").val() != "" || $("#chem").val() != "")
        {
            //if the email field isn't empty (i.e. something is typed in), then check for email validation and post if valid
            if($("#chem").val() != "")
            {
                $("#profSet").validate({
                    rules: {
                        chem: {
                            email: true
                        }
                    }
                });
                if($("#profSet").valid())
                {
                    $.post('php/profSet.php', $('#profSet').serialize(), function(){
                        $('#profSet').hide();
                        $('#success').show();
                    });
                }
            }
            //checks if either of the password fields are filled
            if($("#chpw").val() != "" || $("#chpw2").val() != "")
            {
                //now checks if they are equal
                if($("#chpw").val() == $("#chpw2").val())
                {
                    $.post('php/profSet.php', $('#profSet').serialize(), function(){
                        $('#profSet').hide();
                        $('#success').show();
                    });
                }
                //if they aren't equal (which means if they are mismatching string, or if either one is blank), show error
                else
                {
                    $('#pwerror').show();
                }
            }
            //if it's not an email or password field, then just post, there are no conditionals for the first/last names
            if($("").val())
            {
                $.post('php/profSet.php', $('#profSet').serialize(), function(){
                    $('#profSet').hide();
                    $('#success').show();
                });
            }   
        }
    });

就我如何订购条件而言,此代码的问题很明显。如果跳过较早的条件,则可以提交错误输入而不检查错误输入。

有没有办法让这个表单工作而不写出九个不同的if语句?

2 个答案:

答案 0 :(得分:1)

那里的逻辑似乎相当复杂,所以我认为没有办法避免嵌套的if语句。您可能希望使用标志变量,这样可以更容易地读取和诊断逻辑问题......

所以例如: var isEmail = false;

if($(“#chem”)。val()!=“”){isEmail = true; }

也许这可能会让事情变得更容易。希望这会有所帮助。

答案 1 :(得分:0)

为了澄清,您希望表单提交有效,只要:

  1. 电子邮件(如果提供)有效
  2. 密码(如果提供)必须与密码确认匹配
  3. 这是对的吗?如果是这样,为什么不做这样的事情:

    if (!isEmailValid()) // <-- You need to define how this function works
        // Show error message and stop form submission
    
    if ($("#password").val() != $("#password_confirm").val())
        // Show error message and stop form validation
    
    // No issue with e-mail or password/password confirmation! Let the form submission go through!