Creating 'Encoded' Name & Value Pairs
Passing data from one form to another
Addressing Form Field Validation with Regular Expressions and JavaScript 1.2
You are here: irt.org | Articles | JavaScript | Form | Dropdown Menus #2 [ previous next ]
Published on: Monday 26th May 1997 By: Martin Webb
This article starts from where the previous article Dropdown Menus left of.
By adding the simple MULTIPLE attribute to a selection list, the selection list will now allow multiple selections using the shift and control keys:
<FORM> <SELECT MULTIPLE> <OPTION>Entry 0 <OPTION>Entry 1 <OPTION>Entry 2 <OPTION>Entry 3 <OPTION>Entry 4 <OPTION>Entry 5 </SELECT> </FORM>
The following simple example accesses the multiple options that may have been selected:
<SCRIPT LANGUAGE="JavaScript"> <!-- function onClick(object) { for (var Current=0;Current < object.selectName.options.length;Current++) { var text = eval('object.currentText' + Current); var value = eval('object.currentValue' + Current); if (object.selectName.options[Current].selected) { text.value = object.selectName.options[Current].text; value.value = object.selectName.options[Current].value; } else { text.value = ''; value.value = ''; } } } //--> </SCRIPT> <FORM NAME="formName1" onSubmit="return false;"> <SELECT NAME="selectName" MULTIPLE> <OPTION VALUE="Option 0">Entry 0 <OPTION VALUE="Option 1">Entry 1 <OPTION VALUE="Option 2">Entry 2 <OPTION VALUE="Option 3">Entry 3 <OPTION VALUE="Option 4">Entry 4 <OPTION VALUE="Option 5">Entry 5 </SELECT> <INPUT TYPE="SUBMIT" VALUE="Enter" onClick="onClick(this.form);return false;"> <INPUT TYPE="RESET" VALUE="Clear"> <P>Select items from the above menu, then press enter. The following boxes will display your choices: <P> Text 0: <INPUT NAME="currentText0" TYPE="TEXT" VALUE=""> Value 0: <INPUT NAME="currentValue0" TYPE="TEXT" VALUE=""><BR> Text 1: <INPUT NAME="currentText1" TYPE="TEXT" VALUE=""> Value 1: <INPUT NAME="currentValue1" TYPE="TEXT" VALUE=""><BR> Text 2: <INPUT NAME="currentText2" TYPE="TEXT" VALUE=""> Value 2: <INPUT NAME="currentValue2" TYPE="TEXT" VALUE=""><BR> Text 3: <INPUT NAME="currentText3" TYPE="TEXT" VALUE=""> Value 3: <INPUT NAME="currentValue3" TYPE="TEXT" VALUE=""><BR> Text 4: <INPUT NAME="currentText4" TYPE="TEXT" VALUE=""> Value 4: <INPUT NAME="currentValue4" TYPE="TEXT" VALUE=""><BR> Text 5: <INPUT NAME="currentText5" TYPE="TEXT" VALUE=""> Value 5: <INPUT NAME="currentValue5" TYPE="TEXT" VALUE=""><BR> </FORM>
We can demonstrate one possible practical use of the last example, with the following code which loads a frameset with the required locations, if more than one option is selected, or, if just one option is selected then that location is loaded into the current document:
<SCRIPT LANGUAGE="JavaScript"> <!-- function validate(object) { var atLeastOneSelected = false; var numberOfSelected = 0; var seletedOption = 0; for (var Current=0;Current < object.selectName.options.length;Current++) { if (object.selectName.options[Current].selected) { atLeastOneSelected = true; numberOfSelected += 1; selectedOption = Current; } } if (!atLeastOneSelected) alert('At least one option from the menu must be selected.'); if (numberOfSelected == 1) { window.location.href = object.selectName.options[selectedOption].value; return false; } return atLeastOneSelected; } //--> </SCRIPT> <FORM NAME="formName2" METHOD="GET" ACTION="test.htm"> <SELECT NAME="selectName" MULTIPLE> <OPTION VALUE="test1.htm">location 1 <OPTION VALUE="test2.htm">location 2 <OPTION VALUE="test3.htm">location 3 <OPTION VALUE="test4.htm">location 4 <OPTION VALUE="test5.htm">location 5 <OPTION VALUE="test6.htm">location 6 </SELECT> <INPUT TYPE="SUBMIT" VALUE="Enter" onClick="return validate(this.form)"> <P>Select items from the above menu, then press enter. </FORM>
The source code for the test.htm file would then need to interrogate the search property of the current location:
<SCRIPT LANGUAGE="JavaScript"> <!-- var searchString = self.location.search; var numberOfParameters = 0; var myLink = new Array(); while (searchString.indexOf('=')) { var pos = searchString.indexOf('='); var end = searchString.indexOf('&'); if (end == -1) end = searchString.length; myLink[numberOfParameters++] = searchString.substring(pos+1,end); searchString = searchString.substring(end+1,searchString.length); } var height = Math.floor(100/numberOfParameters); document.write('<FRAMESET FRAMEBORDER=0 ROWS="'); for (Current = 1; Current<numberOfParameters+1; Current++) { if (Current != numberOfParameters) document.write(height+'%,'); else document.write('*">'); } for (Current = 0; Current<numberOfParameters; Current++) document.write('<FRAME SRC="'+myLink[Current]+'">'); document.write('<\/FRAMESET>'); //--> </SCRIPT>
Note, this will not work offline using Microsoft Internet Explorer, i.e. whilst the protocol is file:.
The following example, shows how to add, replace or delete an option.
Note, this will not work with Internet Explorer 3.x.
<SCRIPT LANGUAGE="JavaScript"> <!-- function onChange(object) { var Current = object.selectName.selectedIndex; object.currentText.value = object.selectName.options[Current].text; object.currentValue.value = object.selectName.options[Current].value; } function deleteOption(object) { var Current = object.selectName.selectedIndex; object.selectName.options[Current] = null; } function addOption(object) { var defaultSelected = true; var selected = true; var optionName = new Option(object.currentText.value, object.currentValue.value, defaultSelected, selected) var length = object.selectName.length; object.selectName.options[length] = optionName; } function replaceOption(object) { var Current = object.selectName.selectedIndex; object.selectName.options[Current].text = object.currentText.value; object.selectName.options[Current].value = object.currentText.value; } //--> </SCRIPT> <FORM NAME="formName3" onSubmit="return false;"> <SELECT NAME="selectName" onChange="onChange(this.form)"> <OPTION VALUE="Option 0" SELECTED>Entry 0 <OPTION VALUE="Option 1">Entry 1 <OPTION VALUE="Option 2">Entry 2 <OPTION VALUE="Option 3">Entry 3 <OPTION VALUE="Option 4">Entry 4 <OPTION VALUE="Option 5">Entry 5 </SELECT> <P> Text: <INPUT NAME="currentText" TYPE="TEXT" VALUE=""> Value: <INPUT NAME="currentValue" TYPE="TEXT" VALUE=""> <P> <INPUT TYPE="BUTTON" VALUE="Delete" onClick="deleteOption(this.form)"> <INPUT TYPE="BUTTON" VALUE="Add" onClick="addOption(this.form)"> <INPUT TYPE="BUTTON" VALUE="Replace" onClick="replaceOption(this.form)"> </FORM> <SCRIPT LANGUAGE="JavaScript"> <!-- onChange(document.formName2); //--> </SCRIPT>
Thanks to Martin Honnen for the tip about using history.go(0) to refresh the page after amending a drop down box.
Note, Microsoft Internet Explorer 3.x does not currently support the addition and deletion of options.
Creating 'Encoded' Name & Value Pairs
Passing data from one form to another
Addressing Form Field Validation with Regular Expressions and JavaScript 1.2