【问题标题】:JQuery Validation Working, but submitHandler is notJQuery 验证工作,但 submitHandler 不是
【发布时间】:2020-04-28 17:34:04
【问题描述】:

我有一个表单我正在尝试使用 JQuery Validate 进行验证,它工作正常。当点击提交按钮时,submitHandler 应该 1. 禁用按钮(防止多次提交)和 2. 更改按钮文本。

按原样,代码用于验证,但不调用 submitHandler。

我在这里查看了许多线程,说按钮必须是 type="submit",在 <form> 标签内等,但无法弄清楚。该按钮仍然可以被多次点击。

有什么帮助吗?

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.microsoft.com/ajax/jQuery.Validate/1.6/jQuery.Validate.min.js"></script>


<script type="text/javascript">


$(document).ready(function() {
  $("#freebottleform").validate({
     rules: {
       address : {
           required: true
       },
       city : {
           required: true
       },
       state : {
           required: true
       },
       zipcode : {
           required: true
       },
       phoneNumber : {
           required: true,
           phoneUS: true
       },
     },

     //Specify the validation error messages here
     messages: {
       email: {
         required: "Please enter email address",
        email: "Please enter a valid email address"
       },
       phoneNumber: {
         required : "Please enter your mobile number",
         digits: "Please enter digits only"
       }
     },
        submitHandler: function (form) {
            $("#finalSubmit").attr("disabled", true);
            $("#finalSubmit").html("Submitting... please wait.");
            form.submit();
        }

  });
});


</script>


<!DOCTYPE html>
<html lang="en">
<div class="freebottleform">

    <form method="post"  id="freebottleform" name="freebottleform" action="p6.php">
        Please enter your shipping details.<br>
        <br>
        Address:<br>
        <input type="text" name="address" class="required" placeholder="Please enter your address."/><br>
        <input type="text" name="address2" placeholder="Suite/Apt/Etc."/><br>
        <br>
        City:<br>
        <input type="text" name="city" class="required" placeholder="Please enter your city."/><br>
        <br>
        State:<br>
        <input type="text" name="state" class="required" placeholder="Please enter your state."/><br>
        <br>
        Zip Code:<br>
        <input type="text" name="zipcode" class="required" placeholder="Please enter your zipcode."/><br>
        <br>
        Phone Number:<br>
        <input type="text" name="phoneNumber" class="required" placeholder="Please enter your phone number."/><br>
        <br>
        <label><input type="checkbox" name="subscribe" id="subscribe" value="true" checked/> Subscribe to our newsletter to get FREE weekly tips sent right to your inbox!</label><br>
        <br>

    <button id="finalSubmit" type="submit" name="submit" value="final" >CONTINUE</button>

    </form>

</div>
</html>

【问题讨论】:

  • 几个问题:您是否尝试过升级到较新版本的 JQuery,是否查看过控制台输出是否有异常?
  • 有:TypeError: $.validator.methods[method] is undefined,好像是phoneUS的规则造成的。
  • @msg 就是这样!我以前为电话号码设置了一个方法,但不小心把它留下了。似乎它正在捕获该错误然后忽略所有代码。非常感谢!
  • @Dragonsnap 很好,我不知道我正在运行一个非常旧版本的 JQuery 和验证插件。两者都更新了,但问题仍然存在。用另一个答案解决了它。还是谢谢你!

标签: javascript php html jquery


【解决方案1】:

您可以在客户端对按钮的 click 事件进行验证并禁用该按钮。

<script type="text/javascript">

$("#finalSubmit").click(function()
  {
   //do your validation and if correct then disable the button

    $("#finalSubmit").attr("disabled", true);

    //other work if any
   }
  );
</script>

【讨论】:

    【解决方案2】:

    首先,不要使用 jQuery 进行验证,而是像使用 PHP 等在服务器端进行验证,并将输出反映在显示页面上。

    这里有一个例子:

    index.php

    <!DOCTYPE html>
    <html>
      <head>
        <title>Site Title</title>
      </head>
      <body>
        <h1>Form</h1>
        <div class="message"></div>
        <form method="post" action="" name="registrationForm">
          First Name <input type="text" name="fname"><br>
          Last Name <input type="text" name="lname"><br>
          Phone <input type="text" name="phone"><br>
          <input type="submit" value="Register" class="regbtn">
        </form>
        <script type="text/javascript" src="js/jquery.js"></script>
        <script>
          $(document).ready(function(){
            $(".regbtn").click(function(){
              var form = document.registrationForm;
              var dataString = $(form).serialize();
              $.ajax({
                type: 'POST',
                url: "your-processing-page.php",
                data: dataString,
                cache: true,
                beforeSend: function(){
                  $('.message').hide();
                  $(".regbtn").prop('disabled', true).val('Please wait...');
                },
                success: function(data){
                  $('.message').html(data).fadeIn();
                  $(".regbtn").prop('disabled', false).val('Register');
                }
              });
              return false;
            });
          });
        </script>
      </body>
    </html>
    

    你的处理页面.php

    <?php
    $fname = (!empty($_POST['fname']))?$_POST['fname']:null;
    $lname = (!empty($_POST['lname']))?$_POST['lname']:null;
    $phone = (!empty($_POST['phone']))?$_POST['phone']:null;
    
    if($_POST){
      // Perform Checks Here
      if(trim($fname) == ''){
        echo "Please enter first name.";
      }else if(trim($lname) == ''){
        echo "Please enter last name.";
      }else if((strlen($phone)) == 0){
        echo "Please enter a phone number";
      }else if((strlen($phone)) < 10){
        echo "Phone number must not contain less than 10 digits.";
      }else if((strlen($phone)) > 10){
        echo "Phone number must not contain more than 10 digits.";
      }else{
        // If all checks are cleared perform your query
        $stmt = $pdo->prepare("INSERT INTO members(mem_fname, mem_lname, mem_phone)VALUS(:fname, :lname, :phone)");
        $stmt-> bindValue(':fname', $fname);
        $stmt-> bindValue(':lname', $lname);
        $stmt-> bindValue(':phone', $phone);
        $stmt-> execute();
    
        if($stmt){
          echo "Success! User has been registered.";
        }else{
          echo "Sorry, something went wrong. Please refresh the page and try again!";
        }
      }
    }
    ?>
    

    这是一个完整的答案。这里:

    1. 使用 PHP 在服务器端完成验证(更好的方法,必须遵循)。
    2. jQuery 禁用提交按钮以防止点击后重复提交。
    3. 当提交按钮被按下时,jQuery 更改按钮文本值,并在表单提交成功返回时更改回默认值。

    注意:以上是一个完整的“标准”编码示例。这就是你应该编码的方式。但是,根据您的需要执行其他必要的检查。将上述编码仅作为示例来构建您自己的代码。快乐编码:)

    【讨论】:

      【解决方案3】:

      将提交按钮名称更改为其他名称,因为它会覆盖表单上的 submit() 函数,那么此代码应该适合您(Reference)。 ↓↓

      $(document).ready(function() {
        $("#freebottleform").validate({
          rules: {
            address: {
              required: true
            },
            city: {
              required: true
            },
            state: {
              required: true
            },
            zipcode: {
              required: true
            },
            phoneNumber: {
              required: true,
              // phoneUS: true,
              digits: true
            },
          },
      
          //Specify the validation error messages here
          messages: {
            email: {
              required: "Please enter email address",
              email: "Please enter a valid email address"
            },
            phoneNumber: {
              required: "Please enter your mobile number",
              digits: "Please enter digits only"
            }
          },
          submitHandler: function(form) {
            $("#finalSubmit").attr("disabled", true);
            $("#finalSubmit").html("Submitting... please wait.");
      
            setTimeout(function() {
              form.submit();
            }, 3000);
          }
      
        });
      });
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.19.1/jquery.validate.min.js"></script>
      <!DOCTYPE html>
      <html lang="en">
      
      <head>
      
      </head>
      <div class="freebottleform">
      
        <form method="post" id="freebottleform" name="freebottleform" action="p6.php">
          Please enter your shipping details.<br>
          <br> Address:
          <br>
          <input type="text" name="address" class="required" placeholder="Please enter your address." /><br>
          <input type="text" name="address2" placeholder="Suite/Apt/Etc." /><br>
          <br> City:
          <br>
          <input type="text" name="city" class="required" placeholder="Please enter your city." /><br>
          <br> State:
          <br>
          <input type="text" name="state" class="required" placeholder="Please enter your state." /><br>
          <br> Zip Code:<br>
          <input type="text" name="zipcode" class="required" placeholder="Please enter your zipcode." /><br>
          <br> Phone Number:<br>
          <input type="text" name="phoneNumber" class="required" placeholder="Please enter your phone number." /><br>
          <br>
          <label><input type="checkbox" name="subscribe" id="subscribe" value="true" checked/> Subscribe to our newsletter to get FREE weekly tips sent right to your inbox!</label><br>
          <br>
      
          <button id="finalSubmit" type="submit" name="save" value="final">CONTINUE</button>
      
        </form>
      
      </div>
      
      </html>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-23
        • 1970-01-01
        • 1970-01-01
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多