How to show all the applicable error messages on top of a form instead of showing the error messages one by one?

383 Views Asked by At

I'm having a multi-step form functionality. Following is the code for it. I tried to create a jsFiddle for this code but it was not saving there in fiddle and I was not able to create it. If you just make a HTML file on your system and copy paste the whole code it will run in any browser without making any change.

<!doctype HTML>
<html>
  <head>
  <style>
  /*custom font*/
@import url(http://fonts.googleapis.com/css?family=Montserrat);

/*basic reset*/
* {margin: 0; padding: 0;}

html {
    height: 100%;
    /*Image only BG fallback*/
    background: rgba(0,0,0,0.3) url('bg.jpg');
    background-color: rgba(0,0,0,0.3); 
}

body {
    font-family: montserrat, arial, verdana;
}

#mhead {
  font-family: Georgia !important;
  background-color: #f5f5f5;
  border: 1px solid #e3e3e3;
  -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    border-radius: 4px;
    -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
    text-align: center; 
    font-family: georgia;
    position: fixed;
    top: 0px;
    width: 100%;
    padding: 20px;
} 
/*form styles*/
#msform {
    width: 400px;
    margin: 110px auto;
    text-align: center;
    position: relative;
}
#msform fieldset {
    background: white;
    border: 0 none;
    border-radius: 3px;
    box-shadow: 0 0 15px 1px rgba(0, 0, 0, 0.4);
    padding: 20px 30px;

    box-sizing: border-box;
    width: 80%;
    margin: 0 10%;

    /*stacking fieldsets above each other*/
    position: absolute;
}
/*Hide all except first fieldset*/
#msform fieldset:not(:first-of-type) {
    display: none;
}
/*inputs*/
#msform input, #msform textarea {
    padding: 15px;
    border: 1px solid #ccc;
    border-radius: 3px;
    margin-bottom: 10px;
    width: 100%;
    box-sizing: border-box;
    font-family: montserrat;
    color: #2C3E50;
    font-size: 13px;
}
/*buttons*/
#msform .action-button {
    width: 100px;
    background: #27AE60;
    font-weight: bold;
    color: white;
    border: 0 none;
    border-radius: 1px;
    cursor: pointer;
    padding: 10px 5px;
    margin: 10px 5px;
}
#msform .action-button:hover, #msform .action-button:focus {
    box-shadow: 0 0 0 2px white, 0 0 0 3px #27AE60;
}
/*headings*/
.fs-title {
    font-size: 15px;
    text-transform: uppercase;
    color: #2C3E50;
    margin-bottom: 10px;
}
.fs-subtitle {
    font-weight: normal;
    font-size: 13px;
    color: #666;
    margin-bottom: 20px;
}
/*progressbar*/
#progressbar {
    margin-bottom: 30px;
    overflow: hidden;
    /*CSS counters to number the steps*/
    counter-reset: step;
}
#progressbar li {
    list-style-type: none;
    color: rgb(0,0,0);
    text-transform: uppercase;
    font-size: 11px;
    width: 33.33%;
    float: left;
    position: relative;
}
#progressbar li:before {
    content: counter(step);
    counter-increment: step;
    width: 20px;
    line-height: 20px;
    display: block;
    font-size: 10px;
    color: #333;
    background: white;
    border-radius: 3px;
    margin: 0 auto 5px auto;
}
/*progressbar connectors*/
#progressbar li:after {
    content: '';
    width: 100%;
    height: 2px;
    background: white;
    position: absolute;
    left: -50%;
    top: 9px;
    z-index: -1; /*put it behind the numbers*/
}
#progressbar li:first-child:after {
    /*connector not needed before the first step*/
    content: none; 
}
/*marking active/completed steps green*/
/*The number of the step and the connector before it = green*/
#progressbar li.active:before,  #progressbar li.active:after{
    background: #27AE60;
    color: white;
}
.red{
color: red;
}
.success{
color:green;
}
#message{
padding-top: 200px;
position: relative;
text-align: center;
}
  </style>  

  <!-- jQuery -->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
    <!-- jQuery easing plugin -->
    <script src="http://thecodeplayer.com/uploads/js/jquery.easing.min.js" type="text/javascript"></script>
    <script>
    $(document).ready(function() {
    jQuery('#sucess').hide();
    var current_fs, next_fs, previous_fs; //fieldsets
        var left, opacity, scale; //fieldset properties which we will animate
        var animating; //flag to prevent quick multi-click glitches
        $(".next").click(function(event) {
          var fv=formValidation(event);
            if(fv) {
            } else {
                return false;
            }
            if(animating) return false;
            animating = true;

            current_fs = $(this).parent();
            next_fs = $(this).parent().next();

            //activate next step on progressbar using the index of next_fs
            $("#progressbar li").eq($("fieldset").index(next_fs)).addClass("active");

            //show the next fieldset
            next_fs.show(); 
            //hide the current fieldset with style
            current_fs.animate({opacity: 0}, {
                step: function(now, mx) {
                  //as the opacity of current_fs reduces to 0 - stored in "now"
                  //1. scale current_fs down to 80%
                  scale = 1 - (1 - now) * 0.2;
                  //2. bring next_fs from the right(50%)
                  left = (now * 50)+"%";
                  //3. increase opacity of next_fs to 1 as it moves in
                  opacity = 1 - now;
                  current_fs.css({'transform': 'scale('+scale+')'});
                  next_fs.css({'left': left, 'opacity': opacity});
              }, 
            duration: 800, 
            complete: function() {
                current_fs.hide();
                animating = false;
            }, 
            //this comes from the custom easing plugin
            easing: 'easeInOutBack'
        });
    });

    $(".previous").click(function() {
        if(animating) return false;
        animating = true;

        current_fs = $(this).parent();
        previous_fs = $(this).parent().prev();

        //de-activate current step on progressbar
        $("#progressbar li").eq($("fieldset").index(current_fs)).removeClass("active");

        //show the previous fieldset
        previous_fs.show(); 
        //hide the current fieldset with style
        current_fs.animate({opacity: 0}, {
            step: function(now, mx) {
                //as the opacity of current_fs reduces to 0 - stored in "now"
                //1. scale previous_fs from 80% to 100%
                scale = 0.8 + (1 - now) * 0.2;
                //2. take current_fs to the right(50%) - from 0%
                left = ((1-now) * 50)+"%";
                //3. increase opacity of previous_fs to 1 as it moves in
                opacity = 1 - now;
                current_fs.css({'left': left});
                previous_fs.css({'transform': 'scale('+scale+')', 'opacity': opacity});
            }, 
            duration: 800, 
            complete: function() {
                current_fs.hide();
                animating = false;
            }, 
            //this comes from the custom easing plugin
            easing: 'easeInOutBack'
        });
    });

    $("#msform").submit(function() {

      var fname=jQuery('#fname').val();
      if ($.trim(fname).length == 0) {
        document.getElementById("fname").style.borderColor = "#E34234";
        jQuery('.fs-error').html('<span style="color:red;"> Please Enter First Name !</span>');
        jQuery('.fs-error').show();
        return false;
      } else {
        jQuery('.fs-error').hide();
        var serializedReturn = formData();
        window.location = "http://localhost/multistepform/success.php";
          return false; 
        }
    });
  });

  function formData() {
    var serializedValues = jQuery("#msform").serialize();
        var form_data = {
      action: 'ajax_data',
      type: 'post',
      data: serializedValues,
    };
    jQuery.post('insert.php', form_data, function(response) {
          alert(response);
          // document.getElementById("sucess").style.color = "#006600";
          // jQuery('#sucess').show();
    }); 
    return serializedValues;
  }

  function formValidation(e) {

    var emailval=jQuery('#email').val();
      var mailformat = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;  
    // Checking Empty Fields
    var vemail=mailformat.test(emailval)
    if ($.trim(emailval).length == 0 || vemail==false) {
      jQuery('.fs-error').html('<span style="color:red;"> Email is invalid !</span>');
      return false;
    } else {

        jQuery('.fs-error').hide();
    }

      var f_name = document.getElementById("f_name").value;
    if (f_name == '') {
      document.getElementById("f_name").style.borderColor = "#E34234";

        jQuery('.fs-error').html('<span style="color:red;"> Please enter First Name !</span>');
        jQuery('.fs-error').show();
      return false
    } else {
      document.getElementById("f_name").style.borderColor = "#006600";
      document.getElementById("l_name").style.borderColor = "#006600";
          jQuery('.fs-error').hide();       
    }

    var l_name = document.getElementById("l_name").value;
    if (l_name == '') { 
      document.getElementById("l_name").style.borderColor = "#E34234";
    jQuery('.fs-error').html('<span style="color:red;"> Please enter Last Name !</span>');
        jQuery('.fs-error').show();
      return false
    } else {
      document.getElementById("l_name").style.borderColor = "#006600";
          jQuery('.fs-error').hide();
          return true;
    }   
  }
  </script>

    </head>
    <body>
        <div id="mhead"><h2>Multi Step Form with Progress Bar using jQuery, CSS3 and PHP - <span class="red">Info</span>Tuts</h2></div>

      <!-- multistep form -->
      <form id="msform">
      <!-- progressbar -->
      <ul id="progressbar">
          <li class="active">Account Setup</li>
          <li>Social Profiles</li>
          <li>Personal Details</li>
      </ul>
      <!-- fieldsets -->
        <fieldset>
          <h2 class="fs-title">Create your account</h2>
          <h3 class="fs-subtitle">This is step 1</h3>
          <div class="fs-error"></div>
          <input type="text" name="email" id="email" placeholder="Email" />
          <input type="text" name="f_name"  id="f_name" placeholder="First Name" />
          <input type="text" name="l_name"  id="l_name" placeholder="Last Name" />
          <input type="button" name="next" class="next action-button" value="Next" />
      </fieldset>
      <fieldset>
          <h2 class="fs-title">Social Profiles</h2>
          <h3 class="fs-subtitle">Your presence on the social network</h3>
          <input type="text" name="twitter" placeholder="Twitter" />
          <input type="text" name="facebook" placeholder="Facebook" />
          <input type="text" name="gplus" placeholder="Google Plus" />
          <input type="button" name="previous" class="previous action-button" value="Previous" />
          <input type="button" name="next" class="next action-button" value="Next" />
      </fieldset>
      <fieldset>
            <h2 class="fs-title">Personal Details</h2>
            <h3 class="fs-subtitle">We will never sell it</h3>
            <div class="fs-error"></div>
            <input type="text" name="fname" id="fname" placeholder="First Name" />
            <input type="text" name="lname" id="lname" placeholder="Last Name" />
            <input type="text" name="phone" id="phone" placeholder="Phone" />
            <textarea name="address" id="address" placeholder="Address"></textarea>
          <input type="button" name="previous" class="previous action-button" value="Previous" />
          <input type="submit" name="submit" class="submit action-button" value="Submit" />         
      </fieldset>   
    </form>
  </body>
</html>

Currently error messages are shown one by one when user clicks on "Next" button, but I want to show all the three error messages together when user doesn't enter any data into the fields viz. Email, First Name and Last Name. Currently I'm able to show the error messages one by one. I don't want to do that any more, I want to show all the applicable error messages together when user clicks on "Next" button.

How should I do this? Please help me.

Once again apologies for not able to create a js fiddle.

Thanks.

1

There are 1 best solutions below

1
Round Potato On

You have two options:

1) You collect all of the error messages to a variable, by appending:

rrrorText .= '<span class="stylish">we have toruble!</span>'

And output it prior to form.

2) You make an empty div:

<div id="poo"></div>

And add errors to it with something like javascript:

document.getElementById('poo').innerHTML .= 'we have another problem!';