Search code examples
javascriptvalidationtextbox

JS validation mistakes


I got a problem with my validation of textboxes. I am trying to get something like this.

Click on the button, give a message when something is not filled in, while you fill the empty textbox, the 1 message of that textbox should dissapear.

If you click the button again, with 1 empty textbox, only the message of that textbox should appear.

If you click it twice with nothing filled, it should only appear once ...

I messed something up here ... can someone get me on again?

Thank you in advance!

var list2 = [];
function valideer(el) {
 
    divOutput = document.getElementById("msgbox1");
    var strValideer = "<ul>";

    if (document.getElementById("naam").value === "") {
        list2.push("naam");
    } if (document.getElementById("voornaam").value === "") {
        list2.push("voornaam");
    } if (document.getElementById("straatnr").value === "") {
        list2.push("straatnr");
    } if (document.getElementById("postgem").selectedIndex === 0) {
        list2.push("postgem");
    } if (document.getElementById("telgsm").value === "") {
        list2.push("telgsm");
    } if (document.getElementById("email").value === "") {
        list2.push("email");
    }

    for (var i = 0; i < list2.length; i++) {
        strValideer += "<li><b>" + list2[i] + ": </b>verplicht veld</li>";
    }
    strValideer += "</ul>";
    divOutput.innerHTML = strValideer;
}

function inputChange(el) {
    divOutput = document.getElementById("msgbox1");
    strValideer = "<ul>";
    var naam = document.getElementById("naam").value;
    if (naam !== "") {
        list2.splice(list2.indexOf(el.name), 1);
    }
    for (var i = 0; i < list2.length; i++) {
        strValideer += "<li><b>" + list2[i] + ": </b>verplicht veld</li>";
    }
    strValideer += "</ul>";
    divOutput.innerHTML = strValideer;
}
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
   
    <link href="bootstrap/css/bootstrap_custom.min.css" type="text/css" rel="stylesheet" />
    <!--lay-out met bootstrap grid-->
    <link href="style.css" type="text/css" rel="stylesheet" />
    <script src="woodfactory.js" type="text/javascript"></script>
</head>
<body>
    <section class="container" id="userform">
        <form action="js_form_ontvanger.html" method="get" class="form-horizontal" name="frmUserform" id="frmUserform" onsubmit="return validate(this)" oninput="inputChange(this)">
            <fieldset>
                <legend>Persoonlijke gegevens</legend>
                <div class="container">
                    <div class="row">
                        <div class="span7">
                            <div class="control-group">
                                <label class="control-label" for="naam">naam:</label>
                                <div class="controls">
                                    <input type="text" id="naam" name="naam" placeholder="naam" required onsubmit="valideer(this)" onclick="inputChange(this)">
                                </div>
                            </div>
                            <div class="control-group">
                                <label class="control-label" for="voornaam">voornaam:</label>
                                <div class="controls">
                                    <input type="text" id="voornaam" name="voornaam" placeholder="voornaam"  required onsubmit="valideer(this)" onclick="inputChange(this)">
                                </div>
                            </div>
                            <div class="control-group">
                                <label class="control-label" for="straatnr">straat+nr:</label>
                                <div class="controls">
                                    <input type="text" id="straatnr" name="straatnr" placeholder="straat+nr"  required onsubmit="valideer(this)" onclick="inputChange(this)">
                                </div>
                            </div>
                            <div class="control-group">
                                <label class="control-label" for="postgem">post+gem:</label>
                                <div class="controls">
                                    <select id="postgem" required onsubmit="valideer(this)" onclick="inputChange(this)">
                                        <option value="">-- maak een keuze --</option>
                                        <option value="2000">2000 Antwerpen</option>
                                        <option value="9000">9000 Gent</option>
                                        <option value="9300">9300 Aalst</option>
                                        <option value="9400">9400 Ninove</option>
                                        <option value="9450">9450 Haaltert</option>
                                    </select>
                                </div>
                            </div>
                            <div class="control-group">
                                <label class="control-label" for="telgsm">tel/gsm:</label>
                                <div class="controls">
                                    <input type="text" id="telgsm" name="telgsm" placeholder="tel/gsm"  required onsubmit="valideer(this)" onclick="inputChange(this)">
                                </div>
                            </div>
                            <div class="control-group">
                                <label class="control-label" for="email">email:</label>
                                <div class="controls">
                                    <input type="email" id="email" name="email" placeholder="e-mail"  required onsubmit="valideer(this)" onclick="inputChange(this)">
                                </div>
                            </div>
                            <!--einde span7-->
                        </div>
                        <div class="span4 valid">
                            <div id="msgbox1" class="alert alert-error">
                                <div class="span1">

                                    </div>
                                </div>
                            </div>
                        <div class="span1">
                            <div class="span1">
     
                            </div>
                            <!--einde row-->
                        </div>
                    <!--einde container-->
                </div>
                    </div>
            </fieldset>
          
            <fieldset>
               
                <div class="container">
                    <div class="row">
                        <div class="span7">
                            <div class="control-group">
                            
                                <div class="controls">
                                </div>
                            </div>
                            <div class="control-group">
                                <div class="controls">
                                </div>
                            </div>
                            <div class="control-group">
                                <div class="controls">
                                </div>
                            </div>
                            <div class="form-actions">
                                <button type="submit" class="btn btn-success" onclick="valideer(this)">Verzenden</button>
                            </div>
                        </div>
                        <div class="span4 valid">
                            <div id="msgbox3" class="alert alert-success"></div>
                        </div>
                        <div class="span1"><!--lege kolom--></div>
                        <!--einde row-->
                    </div>
                    <!--einde container-->
                </div>
            </fieldset>
        </form>
    </section>
    <footer class="container">
        <p>&copy; 2013 The Wood Factory </p>
    </footer>
</body>
</html>


Solution

  • I feel like your approach is a little more complicated than it needs to be.. See my attempt below

    function valideer(current) {
      var ids = ['naam', 'voornaam', 'straatnr', 'postgem', 'telgsm', 'email'];
      var str = '<ul>';
      ids.forEach(function(id) {
        var el = document.getElementById(id);
        if (el.value === '' && el !== current) {
          str += "<li><b>" + id + ": </b>verplicht veld</li>";
        }
      });
      str += '</ul>';
      var outputDiv = document.getElementById("msgbox1");
    
      outputDiv.innerHTML = str;
    }
    
    function handleFormSubmit(ev) {
      ev.preventDefault();
      valideer();
      return false;
    }
    <!DOCTYPE html>
    <html>
    
    <head>
      <meta charset="UTF-8">
    
      <link href="bootstrap/css/bootstrap_custom.min.css" type="text/css" rel="stylesheet" />
      <!--lay-out met bootstrap grid-->
      <link href="style.css" type="text/css" rel="stylesheet" />
      <script src="woodfactory.js" type="text/javascript"></script>
    </head>
    
    <body>
      <section class="container" id="userform">
        <form action="js_form_ontvanger.html" method="get" class="form-horizontal" name="frmUserform" id="frmUserform" onsubmit="handleFormSubmit">
          <fieldset>
            <legend>Persoonlijke gegevens</legend>
            <div class="container">
              <div class="row">
                <div class="span7">
                  <div class="control-group">
                    <label class="control-label" for="naam">naam:</label>
                    <div class="controls">
                      <input type="text" id="naam" name="naam" placeholder="naam" required onclick="valideer(this)">
                    </div>
                  </div>
                  <div class="control-group">
                    <label class="control-label" for="voornaam">voornaam:</label>
                    <div class="controls">
                      <input type="text" id="voornaam" name="voornaam" placeholder="voornaam" required onclick="valideer(this)">
                    </div>
                  </div>
                  <div class="control-group">
                    <label class="control-label" for="straatnr">straat+nr:</label>
                    <div class="controls">
                      <input type="text" id="straatnr" name="straatnr" placeholder="straat+nr" required onclick="valideer(this)">
                    </div>
                  </div>
                  <div class="control-group">
                    <label class="control-label" for="postgem">post+gem:</label>
                    <div class="controls">
                      <select id="postgem" required onclick="valideer(this)">
                        <option value="">-- maak een keuze --</option>
                        <option value="2000">2000 Antwerpen</option>
                        <option value="9000">9000 Gent</option>
                        <option value="9300">9300 Aalst</option>
                        <option value="9400">9400 Ninove</option>
                        <option value="9450">9450 Haaltert</option>
                      </select>
                    </div>
                  </div>
                  <div class="control-group">
                    <label class="control-label" for="telgsm">tel/gsm:</label>
                    <div class="controls">
                      <input type="text" id="telgsm" name="telgsm" placeholder="tel/gsm" required onclick="valideer(this)">
                    </div>
                  </div>
                  <div class="control-group">
                    <label class="control-label" for="email">email:</label>
                    <div class="controls">
                      <input type="email" id="email" name="email" placeholder="e-mail" required onclick="valideer(this)">
                    </div>
                  </div>
                  <!--einde span7-->
                </div>
                <div class="span4 valid">
                  <div id="msgbox1" class="alert alert-error">
                    <div class="span1">
    
                    </div>
                  </div>
                </div>
                <div class="span1">
                  <div class="span1">
    
                  </div>
                  <!--einde row-->
                </div>
                <!--einde container-->
              </div>
            </div>
          </fieldset>
    
          <fieldset>
    
            <div class="container">
              <div class="row">
                <div class="span7">
                  <div class="control-group">
    
                    <div class="controls">
                    </div>
                  </div>
                  <div class="control-group">
                    <div class="controls">
                    </div>
                  </div>
                  <div class="control-group">
                    <div class="controls">
                    </div>
                  </div>
                  <div class="form-actions">
                    <button type="submit" class="btn btn-success" onclick="valideer(this)">Verzenden</button>
                  </div>
                </div>
                <div class="span4 valid">
                  <div id="msgbox3" class="alert alert-success"></div>
                </div>
                <div class="span1">
                  <!--lege kolom-->
                </div>
                <!--einde row-->
              </div>
              <!--einde container-->
            </div>
          </fieldset>
        </form>
      </section>
      <footer class="container">
        <p>&copy; 2013 The Wood Factory </p>
      </footer>
    </body>
    
    </html>

    Some notes and observations:

    1. Since the only check being used for validation is if it contains, an empty string, I have generalised the valideer function to iterate and operate on a given array of ids. This can be made even better by querying for inputs on your form using a DOM query and handling it like that.
    2. You have added a lot of inline event handlers in your dom.. Some of them are redundant and not really needed. For example, having a simgle onsubmit on your form element should suffice (no need to add it for every input inside the form)
    3. You were using a global variable list2 this is what was causing the repeated entries each time you click the button. Localising the scope would fix that (by moving it inside a function)