简体   繁体   中英

Check if HTML row inputs are empty

I'm a newbie in HTML and JavaScript world. Basically, I'm trying to validate an HTML table.

I wanna validate on form submit, if any of the elements (inputs or selects) on a table row have a value all the row elements must be completed. For example:

  • if all the elements (inputs or selects) on a row are empty then it's Ok
  • if all the elements (inputs or selects) on a row are completed then it's Ok
  • if only 1, 2 or 3 elements (inputs or selects) on a row are completed then it's not ok (you must complete all of them or none of them), I wanna show an alert to indicate that all the row elements must be completed.

I'm trying to help me to understand how to resolve this problem by searching online. I'm struggling to adaptate the below code to do that:

<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>

<body>

    <form method="post" id="myform" onsubmit="return validate(this);">
    <table>
        <thead>
            <tr>
                <th>type</th>
                <th>subtype</th>
                <th>quantity</th>
                <th>attachment</th>
            </tr>
        </thead>
        <tbody>
        <tr>
            <td>
                <select name="q">
                    <option disabled selected value> -- select an option -- </option>
                    <option>option 1</option>
                    <option>option 2</option>
                    <option>option 3</option>
                </select>
            </td>
            <td>
                <select name="w">
                    <option disabled selected value> -- select an option -- </option>
                    <option>option 4</option>
                    <option>option 5</option>
                    <option>option 6</option>
                </select>               
            </td>
            <td>
                <input type="number" name="e" />
            </td>
            <td>
                <input type="file" name="r">
            </td>
        </tr>

        <tr>
            <td>
                <select name="t">
                    <option disabled selected value> -- select an option -- </option>
                    <option>option 1</option>
                    <option>option 2</option>
                    <option>option 3</option>
                </select>
            </td>
            <td>
                <select name="y">
                    <option disabled selected value> -- select an option -- </option>
                    <option>option 4</option>
                    <option>option 5</option>
                    <option>option 6</option>
                </select>               
            </td>
            <td>
                <input type="number" name="u" />
            </td>
            <td>
                <input type="file" name="i">
            </td>
        </tr>

        <tr>
            <td>
                <select name="o">
                    <option disabled selected value> -- select an option -- </option>
                    <option>option 1</option>
                    <option>option 2</option>
                    <option>option 3</option>
                </select>
            </td>
            <td>
                <select name="p">
                    <option disabled selected value> -- select an option -- </option>
                    <option>option 4</option>
                    <option>option 5</option>
                    <option>option 6</option>
                </select>               
            </td>
            <td>
                <input type="number" name="a" />
            </td>
            <td>
                <input type="file" name="s">
            </td>
        </tr>

        <tr>
            <td>
                <select name="d">
                    <option disabled selected value> -- select an option -- </option>
                    <option>option 1</option>
                    <option>option 2</option>
                    <option>option 3</option>
                </select>
            </td>
            <td>
                <select name="f">
                    <option disabled selected value> -- select an option -- </option>
                    <option>option 4</option>
                    <option>option 5</option>
                    <option>option 6</option>
                </select>               
            </td>
            <td>
                <input type="number" name="g" />
            </td>
            <td>
                <input type="file" name="h">
            </td>
        </tr>

        <tr>
            <td>
                <select name="j">
                    <option disabled selected value> -- select an option -- </option>
                    <option>option 1</option>
                    <option>option 2</option>
                    <option>option 3</option>
                </select>
            </td>
            <td>
                <select name="k">
                    <option disabled selected value> -- select an option -- </option>
                    <option>option 4</option>
                    <option>option 5</option>
                    <option>option 6</option>
                </select>               
            </td>
            <td>
                <input type="number" name="l" />
            </td>
            <td>
                <input type="file" name="m">
            </td>
        </tr>

        </tbody>
    </table>
    <input type="submit" value="submit" />
    </form>

    <script>
    function validate(frm) {
        var tb = frm.getElementsByTagName("table")[0].getElementsByTagName("tbody")[0];

        var trs = tb.getElementsByTagName("tr");
        for (var i=0; i < trs.length; i++) {

            var inputs = trs[i].getElementsByTagName("input");

            if (!validateEmpty(inputs[0]) || !validateEmpty(inputs[1])) {
                return false;
            }
        }
            return true;
    }

    function validateEmpty(obj) {
        if (obj.value == "") {
            alert("empty!");
            obj.select();
            return false;
        }
        return true;
    }
    </script>

</body>

Can you help me to resolve this? Thxs.

UPDATE!

<script>        
function validate(frm) {
    const trs = [...document.querySelectorAll('#myform tr')];
    const isValid = trs.every((tr) => {
      const inputs = [...tr.querySelectorAll('input')];
      const selects = [...tr.querySelectorAll('select')];
      if (
        inputs.every(input => input.value.length === 0) &&
        selects.every(select => select.selectedIndex === 0)
      ) {
        // valid:
        return true;
      }
      return (
        inputs.every(input => input.value.length > 0) &&
        selects.every(select => select.selectedIndex !== 0)
        alert("empty!");
      );
    });
}
</script>

Pretty easy, just iterate over all trs , and iterate over each input and select inside. Use the Array methods to make the syntax easiest:

const trs = [...document.querySelectorAll('#myform tr')];
const isValid = trs.every((tr) => {
  const inputs = [...tr.querySelectorAll('input')];
  const selects = [...tr.querySelectorAll('select')];
  if (
    inputs.every(input => input.value.length === 0) &&
    selects.every(select => select.selectedIndex === 0)
  ) {
    // valid:
    return true;
  }
  return (
    inputs.every(input => input.value.length > 0) &&
    selects.every(select => select.selectedIndex !== 0)
  );
});

I'm using input.value.length rather than just a boolean check of input.value so that inputs of 0 will be accepted as valid as well.

Here's a live snippet that uses Array.from instead, in case you're using an ancient browser:

 document.querySelector('#myform').addEventListener('submit', validate); function validate(e) { e.preventDefault(); const trs = Array.from(document.querySelectorAll('#myform tr')); const isValid = trs.every((tr) => { const inputs = Array.from(tr.querySelectorAll('input')); const selects = Array.from(tr.querySelectorAll('select')); if ( inputs.every(input => input.value.length === 0) && selects.every(select => select.selectedIndex === 0) ) { // valid: return true; } return ( inputs.every(input => input.value.length > 0) && selects.every(select => select.selectedIndex !== 0) ); }); console.log(isValid); } 
 <form method="post" id="myform"> <table> <thead> <tr> <th>type</th> <th>subtype</th> <th>quantity</th> <th>attachment</th> </tr> </thead> <tbody> <tr> <td> <select name="q"> <option disabled selected value> -- select an option -- </option> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> </td> <td> <select name="w"> <option disabled selected value> -- select an option -- </option> <option>option 4</option> <option>option 5</option> <option>option 6</option> </select> </td> <td> <input type="number" name="e" /> </td> <td> <input type="file" name="r"> </td> </tr> <tr> <td> <select name="t"> <option disabled selected value> -- select an option -- </option> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> </td> <td> <select name="y"> <option disabled selected value> -- select an option -- </option> <option>option 4</option> <option>option 5</option> <option>option 6</option> </select> </td> <td> <input type="number" name="u" /> </td> <td> <input type="file" name="i"> </td> </tr> <tr> <td> <select name="o"> <option disabled selected value> -- select an option -- </option> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> </td> <td> <select name="p"> <option disabled selected value> -- select an option -- </option> <option>option 4</option> <option>option 5</option> <option>option 6</option> </select> </td> <td> <input type="number" name="a" /> </td> <td> <input type="file" name="s"> </td> </tr> <tr> <td> <select name="d"> <option disabled selected value> -- select an option -- </option> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> </td> <td> <select name="f"> <option disabled selected value> -- select an option -- </option> <option>option 4</option> <option>option 5</option> <option>option 6</option> </select> </td> <td> <input type="number" name="g" /> </td> <td> <input type="file" name="h"> </td> </tr> <tr> <td> <select name="j"> <option disabled selected value> -- select an option -- </option> <option>option 1</option> <option>option 2</option> <option>option 3</option> </select> </td> <td> <select name="k"> <option disabled selected value> -- select an option -- </option> <option>option 4</option> <option>option 5</option> <option>option 6</option> </select> </td> <td> <input type="number" name="l" /> </td> <td> <input type="file" name="m"> </td> </tr> </tbody> </table> <input type="submit" value="submit" /> </form> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM