【问题标题】:Preventing Double Submit on Form防止表单重复提交
【发布时间】:2016-12-07 09:11:57
【问题描述】:

我正在努力让这个表格正常工作。基本上,当你点击提交时,它会在进入感谢页面之前停顿大约 5 秒钟,用户通常认为他们没有点击正确并尝试至少点击提交 3 次以上。在此之后,当我只想要一个时,我最终收到了 4 个提交。我知道这个问题被问了很多,但我发现的解决方案似乎都不起作用,因为这个“表单”似乎没有表单标签,只是输入。

这个登录页面是以前的网页设计师的作品,我假设他只是使用了天知道在哪里的模板,我的任务是利用我非常有限的知识/经验让它正常工作。我喜欢它的外观和功能,但存在上述问题。

这是 HTML:

<div class="col-sm-4" id="join-us-form">
    <div class="form-bg">
      <div class="form-arrow"></div>
      <h3>title</h3>
      <div id="join-us-results"></div>
      <!-- Form -->
      <form method="POST" action="join_us.php">
        <div class="form-group">
          <input type="text" name="first_name" id="first_name" class="form-control f-input input-field" placeholder="First Name" />
        </div>
        <div class="form-group">
          <input type="text" name="last_name" id="last_name" class="form-control f-input input-field" placeholder="Last Name" />
        </div>
        <div class="form-group">
          <input type="text" name="company" id="company" class="form-control f-input input-field" placeholder="Company" />
        </div>
        <div class="form-group">
          <input type="text" name="email" class="form-control f-input input-field" placeholder="Email" />
        </div>
      <div class="form-group">
          <input type="text" name="phone" maxlength="15"  class="form-control f-input input-field" placeholder="Phone" />
        </div>
        <input type="submit" class="submit-btn" value="Submit" id="submit_btn" onsubmit="document.getElementById('submit_btn').disabled=true; document.getElementById('submit_btn').value='Submitting, please wait...';" />
        </form>
    </div>
  </div>

这里是 Javascript:

/* ==========================
   JOIN-US FORM
=============================*/

$('#submit_btn').on('click', function() { 
    var proceed = true;
    //simple validation at client's end
    //loop through each field and we simply change border color to red for invalid fields       
    $("#join-us-form input[required=true]").each(function(){
        $(this).css('border-color',''); 
        if(!$.trim($(this).val())){ //if this field is empty 
            $(this).css('border','solid 1px red'); //change border color to red   
            proceed = false; //set do not proceed flag
        }
        //check invalid email
        var email_reg = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,4})?$/; 
        if($(this).attr("type")=="email" && !email_reg.test($.trim($(this).val()))){
            $(this).css('border','solid 1px red'); //change border color to red   
            proceed = false; //set do not proceed flag              
        }
    });
    if(proceed) //everything looks good! proceed...
    {
        //get input field values data to be sent to server
        var post_data = {
            'first_name'    : $('input[name=first_name]').val(),
            'last_name'     : $('input[name=last_name]').val(),             
            'user_email'    : $('input[name=email]').val(), 
            'phone_number'  : $('input[name=phone]').val(), 
            'company'       : $('input[name=company]').val()
        };
        //Ajax post data to server
        $.post('join_us.php', post_data, function(response){ 
            if(response.type == 'error'){ //load json data from server and output message     
                var output = '<div class="error">'+response.text+'</div>';
            }else{
                window.location.href = "http://url.com/landing/thank-you.html";
                //output = '<div class="success">'+response.text+'</div>';
                //reset values in all input fields
                $("#join-us-form  input[required=true]").val(''); 
            }
            $("#join-us-results").hide().html(output).slideDown();
        }, 'json');
    }
});

这是 PHP:

<?php
if($_POST)
{
$to_email       = "lead@url.com"; //Recipient email, Replace with your own email.

//check if its an ajax request, exit if not
if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {

    $output = json_encode(array( //create JSON data
        'type'=>'error', 
        'text' => 'Sorry Request must be Ajax POST'
    ));
    die($output); //exit script outputting json data
} 

//Sanitize input data using PHP filter_var().
$first_name     = filter_var($_POST["first_name"], FILTER_SANITIZE_STRING);
$last_name      = filter_var($_POST["last_name"], FILTER_SANITIZE_STRING);
$user_email     = filter_var($_POST["user_email"], FILTER_SANITIZE_EMAIL);
$phone_number   = filter_var($_POST["phone_number"], FILTER_SANITIZE_NUMBER_INT);
$company        = filter_var($_POST["company"], FILTER_SANITIZE_STRING);
$subject        = "Lead / url.com";

//additional php validation
if(strlen($first_name)<4){ // If length is less than 4 it will output JSON error.
    $output = json_encode(array('type'=>'error', 'text' => 'Name is too short or empty!'));
    die($output);
}
if(strlen($last_name)<4){ // If length is less than 4 it will output JSON error.
    $output = json_encode(array('type'=>'error', 'text' => 'Name is too short or empty!'));
    die($output);
}
if(strlen($company)<3){ //check emtpy company
    $output = json_encode(array('type'=>'error', 'text' => 'Please enter a Company Name.'));
    die($output);
}
if(!filter_var($user_email, FILTER_VALIDATE_EMAIL)){ //email validation
    $output = json_encode(array('type'=>'error', 'text' => 'Please enter a valid email!'));
    die($output);
}
if(!filter_var($phone_number, FILTER_SANITIZE_NUMBER_FLOAT)){ //check for valid numbers in phone number field
    $output = json_encode(array('type'=>'error', 'text' => 'Enter only digits in phone number'));
    die($output);
}

//email body
$message_body = "From : ".$first_name."\r\nEmail : ".$user_email."\r\nPhone Number : (".$phone_number.")". $phone_number."\r\nCompany: ".$company ;

//proceed with PHP email.
$headers = 'From: '.$first_name.'' . "\r\n" .
'Reply-To: '.$user_email.'' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

$send_mail = mail($to_email, $subject, $message_body, $headers);
//header('Location: thank-you.html');

if(!$send_mail)
{
    //If mail couldn't be sent output error. Check your PHP email configuration (if it ever happens)
    $output = json_encode(array('type'=>'error', 'text' => 'Could not send mail! Please check your PHP mail configuration.'));
    die($output);
}else{
    $output = json_encode(array('type'=>'message', 'text' => 'Hi '.$first_name .' ! Look to hear from us soon!'));
    die($output);
}

} ?>

唯一有效的方法是在提交输入中添加一个 onclick 以防止再次提交,但如果验证失败,则会卡住,用户无法在不刷新页面的情况下提交.

我对这一切都很陌生,因此非常感谢您的帮助和耐心。

提前致谢。

【问题讨论】:

  • 如此简单,只需在第一次点击后禁用提交按钮,如果它返回任何验证消息则启用。

标签: javascript php html forms


【解决方案1】:

您好disable 提交表单时您的submit button

$("form").submit(function() {
    $(this).find('input[type="submit"]').prop("disabled", true);
})

【讨论】:

    【解决方案2】:

    如您所说,您可以根据用户操作和服务响应来启用和禁用按钮。

    您可以像这样更改您的请求部分;

    if(proceed) //everything looks good! proceed...
        {
    
            $('#submit_btn').prop('disabled', true);
            /* Disable button on request start */
    
            //get input field values data to be sent to server
            var post_data = {
                'first_name'    : $('input[name=first_name]').val(),
                'last_name'     : $('input[name=last_name]').val(),             
                'user_email'    : $('input[name=email]').val(), 
                'phone_number'  : $('input[name=phone]').val(), 
                'company'       : $('input[name=company]').val()
            };
            //Ajax post data to server
            $.post('join_us.php', post_data, function(response){ 
                if(response.type == 'error'){ //load json data from server and output message     
                    var output = '<div class="error">'+response.text+'</div>';
                }else{
                    window.location.href = "http://url.com/landing/thank-you.html";
                    //output = '<div class="success">'+response.text+'</div>';
                    //reset values in all input fields
                    $("#join-us-form  input[required=true]").val(''); 
                }
    
                $('#submit_btn').prop('disabled', false);
                /* Enable button again on request end */
    
                $("#join-us-results").hide().html(output).slideDown();
            }, 'json');
        }
    

    【讨论】:

      【解决方案3】:

      您可以使用 ajax 禁用提交按钮

      beforeSend: function(msg){
          $(".button").button("disable");
        }
      

      成功后启用。

      【讨论】:

        【解决方案4】:

        您可以将变量赋值为 true,当它为 true 时,就可以防止重新提交,就这么简单。

        【讨论】:

          【解决方案5】:

          你可以从字面上添加到你的 JS:

          form.myButton.disabled = true;
              return true;
          

          然后在你的表单标签中添加:

          onsubmit="myButton.disabled
          

          要使用 myButton,您还需要将 name="myButton" 添加到表单中,然后包装 if isset($_POST['myButton'])) { // code }

          【讨论】:

            【解决方案6】:

            不知道,设置禁用道具之类的东西可能会起作用。

            jQuery(document).ready(function($) {
                $('#join-us-form').find('form').on('submit', function(e) {
                    e.preventDefault();
                    if (!$(this).find('input[type="submit"]').prop('disabled')) {
                        $.ajax({
                            url: '/path/to/foo.php',
                            method: 'POST',
                            dataType: 'json', // doesn't have to be, just an example
                            data: {
                                first_name: $(this).find('#first_name').val(),
                                last_name: $(this).find('#last_name').val(),
                                company: $(this).find('#company').val(),
                                email: $(this).find('#email').val(),
                                phone: $(this).find('#phone').val()
                            },
                            beforeSend: function() {
                                $(this).find('input[type="submit"]').prop('disabled', true);
                            },
                            success: function(response) {
                                if (typeof response.error !== 'undefined') { // assuming you're returning something like this
                                    console.log('It works!');
                                }
                                else console.log('Houston, we have a problem ...');
                            },
                            error: function () {
                                console.log('oops!');
                            },
                            complete: function() {
                                $(this).find('input[type="submit"]').prop('disabled', false);
                            }
                        });
                    }
                });
            });
            

            【讨论】:

              【解决方案7】:

              首先,不要相信用户。当您使用 JavaScript 作为您唯一的保护措施时,您就是在信任用户。

              话虽如此: 您的onsubmit 函数不会返回false,因此即使所有保护措施都失败了,表单也会以标准的html 方式提交。见Prevent form redirect OR refresh on submit?https://stackoverflow.com/a/38491643/4275413

              修复该问题后,您可能可以在 ajax.call 之后禁用按钮和其他内容(这是异步的,因此在“成功”内容之外执行此操作,但仅在继续进行时)。您的 javascript - 我相信 - 会覆盖元素上 html 中的 onsubmit。所以这是另一个。

              也许还有更多的事情要做,但你应该先试试这两个。

              【讨论】:

                猜你喜欢
                • 2011-06-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2017-05-05
                • 2011-02-19
                • 2012-04-05
                相关资源
                最近更新 更多