2012-03-02 2 views
1

У меня есть форма на моем сайте. Когда нажата кнопка отправки, запускается функция для получения содержимого каждого поля, проверки содержимого на основе RegEx и других требований, а затем, если все выглядит нормально, форма отправляется через Ajax в почтовую программу .php.Javascript Подтвердить при изменении ввода, отправить только при нажатии кнопки «Отправить»

Я бы хотел, чтобы форма автоматически подтверждалась при изменении значений входного поля или когда поле ввода теряет фокус (у меня нет предпочтения, либо это было бы замечательно) И ТОГДА я хотел бы, чтобы форма отправлялась ТОЛЬКО, когда пользователь нажимает кнопку «Отправить» в форме. Если пользователь нажимает кнопку «Отправить», прежде чем все поля будут действительны, я НЕ хочу, чтобы форма была отправлена.

Вот мой код:

//contact form validation 
$(function(){ 
    $('.error').hide(); 
    // hide error messages onchange 
    $("#contact-form").change(function(){ 
     $('.error').hide(); 
     $("label#name_error").hide(); 
     $("label#invalid_error").hide(); 
     $("label#email_error").hide(); 
     $("label#invalid_phone_error").hide(); 
     $("label#phone_error").hide(); 
     $("label#zip_error").hide(); 
    }); 

    // validate fields on click 
    $(".cool-button").click(function(){ 
     $('.error').hide(); 
     $("label#name_error").hide(); 
     $("label#invalid_error").hide(); 
     $("label#email_error").hide(); 
     $("label#invalid_phone_error").hide(); 
     $("label#phone_error").hide(); 
     $("label#zip_error").hide(); 

     var name=$("input#contact_name").val(); 
     var email=$("input#contact_email").val(); 
     var emailRegEx =/^([a-zA-Z0-9])(([a-zA-Z0-9])*([\._-])?([a-zA-Z0-9]))*@(([a-zA-Z0-9\-])+(\.))+([a-zA-Z]{2,4})+$/ 
     var phone=$("input#contact_phone").val(); 
     var phone=phone.replace(/\s+-/g, ""); 
     var phoneRegEx = /^(1-?)?\s?(\([2-9]\d{2}\)|\s?-?[2-9]\d{2})-?\s?[2-9]\d{2}-?\d{4}$/ 
     var zip=$("input#contact_zip").val(); 
     var best_time=$("input#contact_best_time").val(); 
     var message=$("textarea#contact_message").val(); 
     var timestamp=$("input#timestamp").val(); 

     if(name==""){ 
      $("label#name_error").show(); 
      $("input#contact_name").focus();return false; 
      } 
     if(email==""){ 
      $("label#email_error").show(); 
      $("input#contact_email").focus();return false; 
      } 
     if (document.getElementById('contact_email').value.search(emailRegEx)==-1) { 
      $("label#invalid_error").show(); 
      $("input#contact_email").focus();return false; 
      } 
     if(phone==""){ 
      $("label#phone_error").show(); 
      $("input#contact_phone").focus();return false; 
      } 
     if (document.getElementById('contact_phone').value.search(phoneRegEx)==-1) { 
      $("label#invalid_phone_error").show(); 
      $("input#contact_phone").focus();return false; 
      } 
     if(zip==""){ 
      $("label#zip_error").show(); 
      $("input#contact_zip").focus();return false; 
      } 
     if(message==""){ 
      $("label#message_error").show(); 
      $("textarea#contact_message").focus();return false; 
      } 
     else { 
var dataString='contact_name='+name+'&contact_email='+email+'&contact_phone='+phone+'&contact_zip='+zip+'&contact_best_time='+best_time+'&timestamp='+timestamp+'&contact_message='+encodeURIComponent(message); 
    $.ajax({ 
     type:"POST", 
     url:"php/contact.php", 
     data:dataString, 
     success:function(){$('#contact-form').html("<div id='message'></div>");$('#message').html("<h3>Message Sent</h3>").append("<p>Thank you for contacting us. We'll be in touch. <br /><br />If you have any further questions, you can always email us at [email protected] or call us at 800-924-9473</p>").hide().fadeIn(800,function(){$('#message').append("<img id='checkmark' src='images/submit2.png' />");});}}); 
     } 
     return false; 
    }); 

}); 

И вот HTML и PHP код формы

<form id="contact-form" method="post" action="#"> 
          <p class="form-subscr-field"> 
          <label for="contact_name" id="contact_name_label">Your name: *</label> 
          <input id="contact_name" type="text" name="contact_name" class="inputbox" size="10" required/> 
          <label class="error error-tip" for="contact_name" id="name_error" style="display: none; ">Please enter your name.</label> 
          </p> 
          <p class="form-subscr-field"> 
          <label for="contact_email" id="contact_email_label">E-mail Address: *</label> 
          <input id="contact_email" type="email" name="contact_email" class="inputbox" size="10" required/> 
          <label class="error error-tip" for="contact_email" id="email_error" style="display: none; ">Please enter your email address.</label> 
          <label class="error error-tip" for="contact_email" id="invalid_error" style="display: none; ">Invalid email address.</label> 
          </p> 
          <fieldset class="w50"> 
          <p class="form-subscr-field rowElem left"> 
          <label for="contact_phone" id="contact_phone_label">Phone: *</label> 
          <input id="contact_phone" type="tel" name="contact_phone" class="inputbox" size="10" required minlength="9"/> 
          <label class="error error-tip" for="contact_phone" id="phone_error" style="display: none; ">Please enter your phone number.</label> 
          <label class="error error-tip" for="contact_phone" id="invalid_phone_error" style="display: none; ">Please enter a valid phone number.</label> 
          </p> 
          </fieldset> 
          <fieldset class="w50"> 
          <p class="form-subscr-field rowElem right"> 
          <label for="contact_zip" id="contact_zip_label">Zip Code: *</label> 
          <input id="contact_zip" type="text" name="contact_zip" class="inputbox" size="10" required minlength="5"/> 
          <label class="error error-tip" for="contact_zip" id="zip_error" style="display: none; ">Please enter your shipping zip code.</label> 
          </p> 
          </fieldset> 
          <p class="form-subscr-field"> 
          <label for="contact_best_time" id="contact_best_time_label">Best time to Contact:</label> 
          <input id="contact_best_time" type="text" name="contact_best_time" class="inputbox" size="10" /> 
          </p> 
          <p class="form-subscr-field"> 
          <label for="contact_message" id="comment_label">Your message: *</label> 
          <textarea id="contact_message" name="contact_message" rows="8" cols="30" required minlength="2"></textarea> 
          <label class="error error-tip" for="contact_message" id="message_error" style="display: none; ">This field is required.</label> 
          </p> 
          <input type="hidden" id="timestamp" name="timestamp" value="<?php 
$hourdiff = "2"; // hours diff btwn server and local time 
$insertdate = date("l, d F Y h:i a",time() + ($hourdiff * 3600)); 
print ("$insertdate"); 
?>" /> 
          <div class="submit-contact"> 
          <p> 
           <input type="submit" name="submit" class="cool-button csbutton-color spot-action" id="contact_button" value="Submit" /> 
          </p> 
          </div> 
         </form> 
+0

Просто любопытно; вы также проверяете на сервере? –

+0

Проблема, связанная с немедленной проверкой, заключается в том, что вы будете показывать ошибки для полей без значений. Вы должны разбить это либо вручную, что было бы уродливо, либо с каким-то плагином/библиотекой (которую вы могли бы написать сами). –

+0

@Jeffery: Чтобы убедиться, что я понимаю ваш вопрос, объясните, что вы подразумеваете под контролем на сервере? – adamdehaven

ответ

0

Вы должны использовать какой-то валидатор плагин. Лично я использовал инструмент проверки формы jquery, и он отлично работает. Есть и другие. Проверьте это: http://flowplayer.org/tools/validator/

Я также использую плагин, который я построил, который будет принимать форму и отправить его с помощью AJAX, и есть некоторые там, которые работают в реальном похожа на мою:

http://jquery.malsup.com/form/

Это один из примеров. Это позволяет вам сделать форму в обычном html, и она отправит форму в URL-адрес формы формы, и она будет строить значения форм так же, как браузер, если вы отправили без ajax. Таким образом, независимо от того, что ваш серверный сценарий представляет собой поля формы, отправьте так же, как если бы вы не использовали ajax.

Поскольку это кажется слишком большим для вас, позвольте мне показать вам, как выглядит ваш код с ним и без него.

Без (смотрите выше на свои js).

Нет предполагая, вашей формы выглядит следующим образом (упрощенный)

<form method="POST" action="php/contact.php"> 
    <label for="contact_name">Name</label> 
    <input name="contact_name" id="contact_name" /> 
    <br /> 
    <label for="contact_email">Email</label> 
    <input name="contact_email" id="contact_email" /> 
    <br /> 
    <label for="contact_phone">Phone</label> 
    <input name="contact_phone" id="contact_phone" /> 
    <br /> 
    <label for="contact_zip">Zip</label> 
    <input name="contact_zip" id="contact_zip" /> 
    <br /> 
    <label for="contact_best_time">Best time for Contact</label> 
    <input name="contact_best_time" id="contact_best_time" /> 
    <br /> 
    <label for="contact_message">Message:</label> 
    <input name="contact_message" id="contact_message" /> 
</form> 

Теперь это, вероятно, похож на то, что он выглядит теперь без все дополнительной HTML для форматирования.

Если вы использовали валидатор и валидатор формы ajax, вам не нужно вносить никаких изменений. Позвольте мне показать их.

С валидатора и АЯКС форме вы бы тогда это:

<form method="POST" action="php/contact.php" class="use-validator ajax-form"> 
    <label for="contact_name">Name</label> 
    <input name="contact_name" id="contact_name" /> 
    <br /> 
    <label for="contact_email">Email</label> 
    <input name="contact_email" id="contact_email" type="email" required="required" /> 
    <br /> 
    <label for="contact_phone">Phone</label> 
    <input name="contact_phone" id="contact_phone" type="phone" /> 
    <br /> 
    <label for="contact_zip">Zip</label> 
    <input name="contact_zip" id="contact_zip" required="required" /> 
    <br /> 
    <label for="contact_best_time">Best time for Contact</label> 
    <input name="contact_best_time" id="contact_best_time" required="required" /> 
    <br /> 
    <label for="contact_message">Message:</label> 
    <textarea name="contact_message" id="contact_message" required="required"></textarea> 
</form> 

Тогда ваши JS будет:

$.tools.validator.fn("[type=phone]", "Invalid phone number", function(input, value) { 
    var phoneRegEx = /^(1-?)?\s?(\([2-9]\d{2}\)|\s?-?[2-9]\d{2})-?\s?[2-9]\d{2}-?\d{4}$/ 
    return value.test(phoneRegEx); 
}); 

$("form.use-validator").validator(); 

$("form.ajax-form").ajaxForm({ 
success:function(){$('#contact-form').html("<div id='message'></div>");$('#message').html("<h3>Message Sent</h3>").append("<p>Thank you for contacting us. We'll be in touch. <br /><br />If you have any further questions, you can always email us at [email protected] or call us at 800-924-9473</p>").hide().fadeIn(800,function(){$('#message').append("<img id='checkmark' src='images/submit2.png' />");});}}); 
}); 

И любые пользовательские валидаторы вы делаете вы можете использовать другие формы ..

И тогда вам могут потребоваться некоторые пользовательские сообщения об ошибках, но это все. Вы можете удалить все остальные JS-коды, которые у вас есть.

+0

Я обновил свой ответ. Я не могу сказать из вашего кода, насколько ошибки выглядят для вашей формы, но я обнаружил, что с плагином valiator и небольшим количеством работы это сэкономит вам тонны кода. А затем форма ajax упрощает процесс отправки формы, поэтому вам не нужно вручную создавать сообщения post/get для отправки. –

+0

Мои ошибки стилизованы с помощью CSS и выглядят как подсказки jquery. У них есть определенные классы, прикрепленные к ним для стилизации, а затем показаны или скрыты в зависимости от проверки. Если я использую обновленный код, который вы указали выше, должен ли я включать/прикреплять файл «validate» или что-нибудь еще? – adamdehaven

+0

Если у вас есть пользовательская проверка, вам нужно будет сделать валидатор для каждого. Вы могли бы использовать валидатор выше в сочетании с тем, как вы это делаете сейчас, но вам придется немного поработать. Можете ли вы включить в свое исходное сообщение то, что выглядит html для вашей формы? Я скучаю, как/где появляются ошибки. –

0

Обычно это достигается с помощью функции keyup. Всякий раз, когда выдается ключ, функция может быть вызвана, чтобы убедиться, что все поля точны, и если да, то оставил пользователь ненавязчивым. В вашем случае вы можете отключить кнопку отправки, если все поля не верны.

Примечания: Вы никогда не должны изменять в настоящее время отредактированных текстовых полей с функцией, или сделать что-нибудь еще, что будет оказаться неприятностью пользователя;)


Edit: Я изменил код для проверки каждого время для всех полей ввода отменяется. Я не владею JQuery, поэтому я сделал это с ванильным Javascript. Если нужно, это должно быть довольно легко конвертировать.

$(function(){ 


    var inputs = document.getElementsByTagName("input"); 

    for(var i = 0; i < inputs.length; i++) { 

    inputs[i].addEventListener("keyup", function(){validate()}, true); 

    } 


    $('.error').hide(); 
    $(".cool-button").click(function(){validate()}); 

    function validate() { 
          $('.error').hide(); 
          $("label#name_error").hide(); 
          $("label#invalid_error").hide(); 
          $("label#email_error").hide(); 
          $("label#invalid_phone_error").hide(); 
          $("label#phone_error").hide(); 
          $("label#zip_error").hide(); 

          var name=$("input#contact_name").val(); 
          var email=$("input#contact_email").val(); 
          var emailRegEx =/^([a-zA-Z0-9])(([a-zA-Z0-9])*([\._-])?([a-zA-Z0-9]))*@(([a-zA-Z0-9\-])+(\.))+([a-zA-Z]{2,4})+$/ 
          var phone=$("input#contact_phone").val(); 
          var phone=phone.replace(/\s+-/g, ""); 
          var phoneRegEx = /^(1-?)?\s?(\([2-9]\d{2}\)|\s?-?[2-9]\d{2})-?\s?[2-9]\d{2}-?\d{4}$/ 
          var zip=$("input#contact_zip").val(); 
          var best_time=$("input#contact_best_time").val(); 
          var message=$("textarea#contact_message").val(); 
          var timestamp=$("input#timestamp").val(); 

          if(name==""){ 
          $("label#name_error").show();$("input#contact_name").focus();return false; 
          } 
          if(email==""){ 
          $("label#email_error").show();$("input#contact_email").focus();return false; 
          } 
          if (document.getElementById('contact_email').value.search(emailRegEx)==-1) { 
          $("label#invalid_error").show();$("input#contact_email").focus();return false; 
          } 
          if(phone==""){ 
          $("label#phone_error").show();$("input#contact_phone").focus();return false; 
          } 
          if (document.getElementById('contact_phone').value.search(phoneRegEx)==-1) { 
          $("label#invalid_phone_error").show();$("input#contact_phone").focus();return false; 
          } 
          if(zip==""){ 
          $("label#zip_error").show();$("input#contact_zip").focus();return false; 
          } 
          if(message==""){ 
          $("label#message_error").show();$("textarea#contact_message").focus();return false; 
          } 
          else { 
          var dataString='contact_name='+name+'&contact_email='+email+'&contact_phone='+phone+'&contact_best_time='+best_time+'&contact_zip='+zip+'&timestamp='+timestamp+'&contact_message='+encodeURIComponent(message); 
          $.ajax({ 
           type:"POST", 
           url:"php/contact.php", 
           data:dataString, 
           success:function(){$('#contact-form').html("<div id='message'></div>");$('#message').html("<h3>Message Sent</h3>").append("<p>Thank you for contacting us. We'll be in touch. <br /><br />If you have any further questions, you can always email us at [email protected] or call us at 800-924-9473</p>").hide().fadeIn(800,function(){$('#message').append("<img id='checkmark' src='images/submit2.png' />");});}}); 
          } 
          return false; 
          }; 
    }); 
+0

Есть ли способ изменить код, который у меня уже есть? У меня есть специальные подсказки jQuery, которые уже встроены в сообщения проверки. Я хотел бы сделать все, прежде чем оператор «else», когда поля ввода потеряют фокус, а затем выполнить действие «else» ТОЛЬКО, когда все поля верны, И ТОЛЬКО, когда пользователь нажимает кнопку «Отправить». – adamdehaven

+0

Может показаться, что много работы или кода для добавления, но инструмент проверки jquery tools является небольшим плагином и сэкономит вам тонны кода, если вы делаете это каждый раз, когда хотите отправить форму. Плагин формы избавит вас от необходимости вручную сериализовать форму (это то, что вы сделали выше) –

+0

Повторить все формы на сайте в этот момент было бы ОГРОМНЫМ предприятием :( Нет ли способа просто разделите функцию на две разные вещи, где: Функция 1 - получает значение размытия или при изменении из поля ввода, а затем проверяет и выдает всплывающее сообщение, если оно неверно. Функция 2 - Если первые функции какую-нибудь переменную (или какой-нибудь лучший способ ее сделать) до «действительного» или чего-то еще, тогда, когда пользователь нажимает кнопку «Отправить», форма отправляется? – adamdehaven

0

Я, как правило, нарушаю валидацию для каждого входа, что делает этот материал намного проще. Вы также можете использовать плагин jQuery, который, вероятно, будет более модульным в долгосрочной перспективе.

То есть, я хотел бы сделать это так (working jsFiddle):

//contact form validation 
$(function() { 
    $('.error').hide(); //hide all errors 
    function fieldHasValue(field, label) { 
     var value = field.val().trim(); //Grab value without leading or trailing whitespace 
     if (value.length > 0) { 
      label.hide(); 
     } else { 
      label.show(); 
      field.focus(); 
     } 
     return (value.length > 0); 
    } 
    function nameIsValid() { 
     return fieldHasValue($("input#contact_name"), $("label#name_error")); 
    } 
    function emailIsValid() { 
     var email = $("input#contact_email").val().trim(); //Grab value without leading or trailing whitespace 
     var emailRegEx = /^([a-zA-Z0-9])(([a-zA-Z0-9])*([\._\-])?([a-zA-Z0-9]))*@(([a-zA-Z0-9\-])+(\.))+([a-zA-Z]{2,4})+$/; 
     var isValid = (email.length > 0) && email.match(emailRegEx); 
     if (isValid) { 
      $("label#email_error").hide(); 
      $("label#invalid_error").hide(); 
     } else if (email.length > 0) { 
      $("label#invalid_error").show(); 
      $("input#contact_email").focus(); 
     } else { 
      $("label#email_error").show(); 
      $("input#contact_email").focus(); 
     } 
     return isValid; 
    } 
    function phoneIsValid() { 
     var phone = $("input#contact_phone").val().replace(/\s+-/g, "").trim(); //Grab value without leading or trailing whitespace and replace [whitespace -] with an empty string. 
     var phoneRegEx = /^(1-?)?\s?(\([2-9]\d{2}\)|\s?-?[2-9]\d{2})-?\s?[2-9]\d{2}-?\d{4}$/; 
     var isValid = (phone.length > 0) && phone.match(phoneRegEx); 
     if (isValid) { 
      $("label#invalid_phone_error").hide(); 
      $("label#phone_error").hide(); 
     } else if (phone.length > 0) { 
      $("label#invalid_phone_error").show(); 
      $("input#contact_phone").focus(); 
     } else { 
      $("label#phone_error").show(); 
      $("input#contact_phone").focus(); 
     } 
     return isValid; 
    } 
    function zipIsValid() { 
     return fieldHasValue($("input#contact_zip"), $("label#zip_error")); 
    } 
    function messageIsValid() { 
     return fieldHasValue($("textarea#contact_message"), $("label#message_error")); 
    } 
    function bestTimeIsValid() { 
     return fieldHasValue($("input#contact_best_time"), $("label#best_time_error")); 
    } 
    function allInputsAreValid() { 
     var validName = nameIsValid(); 
     var validEmail = emailIsValid(); 
     var validPhone = phoneIsValid(); 
     var validZIP = zipIsValid(); 
     var validMessage = messageIsValid(); 
     var validBestTime = bestTimeIsValid(); 
     var isValid = validName && validEmail && validPhone && validZIP && validMessage && validBestTime; 
     return isValid; 
    } 
    $("input#contact_name").on('change blur', nameIsValid); 
    $("input#contact_email").on('change blur', emailIsValid); 
    $("input#contact_phone").on('change blur', phoneIsValid); 
    $("input#contact_zip").on('change blur', zipIsValid); 
    $("textarea#contact_message").on('change blur', messageIsValid); 
    $("input#contact_best_time").on('change blur', bestTimeIsValid); 
    $("input#contact_button").on('click', function (e) { 
     var timestamp = $("input#timestamp").val(); 

     if (allInputsAreValid()) { 
      var dataString = 'contact_name=' + name + '&contact_email=' + email + '&contact_phone=' + phone + '&contact_zip=' + zip + '&contact_best_time=' + best_time + '&timestamp=' + timestamp + '&contact_message=' + encodeURIComponent(message); 
      $.ajax({ 
       type: "POST", 
       url: "php/contact.php", 
       data: dataString, 
       success: function() { 
        $('#contact-form').html("<div id='message'></div>"); 
        $('#message').html("<h3>Message Sent</h3>").append("<p>Thank you for contacting us. We'll be in touch. <br /><br />If you have any further questions, you can always email us at [email protected] or call us at 800-924-9473</p>").hide().fadeIn(800, function() { 
         $('#message').append("<img id='checkmark' src='images/submit2.png' />"); 
        }); 
       } 
      }); 
     } 
     e.preventDefault(); 
     return false; 
    }); 
}); 
Смежные вопросы