Protecting HTML Page Elements with JavaScript and CSS
December 4, 2002 Timothy Prickett Morgan
Hey, David:
I have an HTML form with several optional elements. Is there a way to protect and unprotect text elements based on a checkbox? When the user checks an alternate shipping address box, I want to open up a set of shipping address fields. I tried to do this with JavaScript, but the value of the checkbox doesn’t seem to change in Internet Explorer.
| 
 | 
— Loren
You were on the right track checking the value for the checkbox; however checkboxes are a special case.
The value attribute for checkboxes represents what the browser sends to the server when the checkbox is checked but doesn’t indicate whether it is checked. There is a special checked property that indicates the checked state.
I have provided a snippet of HTML code to get you started. In this example, I have also grayed out the shipping description fields to make it more obvious to the user that the fields are protected:
<html>
<head>
  <title> Demonstrate Optional Form Elements</title>
  <style>
    .protected {
    color: gray;
    font-style: italic;}
    .unprotected {
    color: black;
    font-style: normal;}
  </style>
  <script language="JavaScript" type="text/javascript">
    function shipToChange() {
      if (document.getElementById("shipTo").checked == true) {
        document.getElementById("textShipTo").className="unprotected";
        document.getElementById("shipToName").disabled=false;
        document.getElementById("shipToName").focus();
        document.getElementById("shipToLine1").disabled=false;
        document.getElementById("shipToLine2").disabled=false;
        document.getElementById("shipToCity").disabled=false;
        document.getElementById("shipToState").disabled=false;
        document.getElementById("shipToZip").disabled=false;
      }
      else {
        document.getElementById("textShipTo").className="protected";
        document.getElementById("shipToName").disabled=true;
        document.getElementById("shipToLine1").disabled=true;
        document.getElementById("shipToLine2").disabled=true;
        document.getElementById("shipToCity").disabled=true;
        document.getElementById("shipToState").disabled=true;
        document.getElementById("shipToZip").disabled=true;
      }
    }
  </script>
</head>
<body>
  <form name="myForm" method="POST">
    <table>
      <tfoot>
        <tr>
          <td colspan="2">
            <input type="submit" name="submit" value="Update">
            <input type="submit" name="cancel" value="Cancel">
          </td>
        </tr>
      </tfoot>
      <tbody>
        <tr valign="top">
          <td>Billing Address:</td>
          <td>
            <input type="text" name="billToName" size="30"><br />
            <input type="text" name="billToLine1" size="30"><br />
            <input type="text" name="billToLine2" size="30"><br />
            <input type="text" name="billToCity" size="20">
            <input type="text" name="billToState" size="2">
            <input type="text" name="billToZip" size="10">
          </td>
        </tr>
        <tr align="top" valign="top">
          <td>Specify Shipping Address:</td>
          <td><input type="checkbox" name="shipTo" onchange="shipToChange();"></td>
        </tr>
    <tr valign="top">
          <td id="textShipTo">Ship To:</td>
          <td align="top">
            <input type="text" name="shipToName" size="30"><br />
            <input type="text" name="shipToLine1" size="30"><br />
            <input type="text" name="shipToLine2" size="30"><br />
            <input type="text" name="shipToCity" size="20">
            <input type="text" name="shipToState" size="2">
            <input type="text" name="shipToZip" size="10">
          </td>
        </tr>
      </tbody>
    </table>
  </form>
  <script language="JavaScript">
    shipToChange();
  </script>
</html>
To try this out on your computer, cut and paste the HTML source code listed above into an empty document and save it with a .html extension. When you are done, open it with your browser and try checking and unchecking the ship-to address. After toggling the checkbox, try typing an address in the ship-to address fields.
The elements on this page that are referred to in the javascript all have a property name or ID set by the name attribute for <input> elements, and by the ID attribute of the <td> element. This choice let me use the document.getElementById() function to manipulate those elements attributes. When a change is detected in the shipTo element, the shipToChange() script is run to set the style attributes of the ship-to address elements.
— David
| Sponsored By  ADVANCED SYSTEMS CONCEPTS | 
| 
                    Business Analytics SEQUEL FYI 
                    User Quote: SEQUEL FYI offers outstanding OLAP business intelligence functionality for a fraction of the cost of comparable solutions. | 

 
							  
								
 
					