2016-08-02 4 views
0

Я нахожусь в своем уме, пытаясь заставить эту форму работать правильно. В основном, когда вы нажимаете submit на это, он останавливается около 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-\.][email protected]([\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  = "[email protected]"; //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 к вводу отправки, что помешало ему снова отправить его, но если проверка не прошла, он застрял, и пользователь не смог бы отправить его без обновления страницы.

Я новичок во всем этом, поэтому помощь и терпение будут очень благодарны.

Заранее спасибо.

+3

Так просто просто отключите кнопку отправки после первого щелчка и включите, если оно вернет любое подтверждение. –

ответ

0

Привет только disable ваш submit button, когда форма была отправлена ​​

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

Как вы сказали, вы можете включить и отключить кнопку в соответствии с действиями пользователя и ответа от вашей службы.

Вы можете изменить свой раздел запроса таким образом;

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'); 
    } 
+0

Это сработало, спасибо! Ты спасатель жизни! – hughesj

0

Вы можете отключить кнопку отправки с помощью Ajax

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

и включить после успеха.

0

Вы можете назначить переменную true и, когда она истинна, предотвращает повторное представление так просто.

0

Вы можете буквально добавить к вашему JS:

form.myButton.disabled = true; 
    return true; 

, а затем в тег вашей формы оный:

onsubmit="myButton.disabled 

Для использования MyButton вам нужно также добавить в форму, а затем name="myButton" wrap a if isset($_POST['myButton'])) { // code }

0

Не знаю, что-то вроде установки инвалида может работать.

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); 
       } 
      }); 
     } 
    }); 
}); 
0

Прежде всего, не доверяйте пользователю. При использовании JavaScript в качестве единственной гарантии вы доверяете пользователю.

Это, как говорится: Ваша onsubmit функция не возвращает false, поэтому форму получить поданную стандартный HTML путь, даже если все гарантии терпят неудачу. См Prevent form redirect OR refresh on submit? и https://stackoverflow.com/a/38491643/4275413

После зафиксировано, что, вероятно, можно отключить кнопки и прочее после ajax.call он (который является асинхронным, так это сделать за пределами «успеха» вещи, но только при следовании). Ваш javascript - я верю - перезаписывает onsubmit в html на элементе. Так что это еще один.

Возможно, есть что-то еще, но вы должны попробовать эти два для начала.