Drop down list values depending on a selected value in another drop down list

Viewed 76

I have 6 different Items:

Type1Item1
Type1Item2
Type1Item3

Type2Item1
Type2Item2
Type2Item3

of 2 different types:

Type1
Type2

I want to provide 2 DropDownLists: one to select a type, another to select items of the selected type.

Writing just

<select name="ItemTypeSelector" id="ItemTypeSelector">
  <option value="Type1">Type1</option>
  <option value="Type2">Type2</option>
</select><br>

<select name="ItemSelector" id="ItemSelector">
  <option value="Type1Item1">Type1Item1</option>
  <option value="Type1Item2">Type1Item2</option>
  <option value="Type1Item3">Type1Item3</option>
  <option value="Type2Item1">Type2Item1</option>
  <option value="Type2Item2">Type2Item2</option>
  <option value="Type2Item3">Type2Item3</option>
</select><br>

JSFiddle demo

Would allow users to select Type2 and Type1Item3 which does not make sense since Type1Item3 is of type Type1.

QUESTION: Is there a way to display Items of the drop down list related to the selected ItemType?

3 Answers

Using a select with optgroup may be a viable and simple solution for you:

<select name="ItemSelector" id="ItemSelector">
  <optgroup label="Type1">
    <option value="Type1Item1">Type1Item1</option>
    <option value="Type1Item2">Type1Item2</option>
    <option value="Type1Item3">Type1Item3</option>
  </optgroup>
  <optgroup label="Type2">
    <option value="Type2Item1">Type2Item1</option>
    <option value="Type2Item2">Type2Item2</option>
    <option value="Type2Item3">Type2Item3</option>
  </optgroup>
</select>
Read more here

You can toggle a "disabled" attribute. If a user selects type1 you should add a disabled attribute to all type2* options.

I have coded an example with pure Javascript.

window.onload = function() {
    let current_val = '';
  document.getElementById('ItemTypeSelector').addEventListener('change', function() {
    current_val = this.value;
    
    console.log(current_val);
    for (let el of document.querySelectorAll('#ItemSelector option')) {
        el.style.display = 'none';
    }
    for (let el of document.querySelectorAll('#ItemSelector option[data-type="'+current_val+'"]')) {
      el.style.display = 'block';
    }
  }, false)
};
<select name="ItemTypeSelector" id="ItemTypeSelector">
  <option value="type1">Type1</option>
  <option value="type2">Type2</option>
</select><br>

<select name="ItemSelector" id="ItemSelector">
  <option>Choose</option>
  <option value="Type1Item1" data-type="type1">Type1Item1</option>
  <option value="Type1Item2" data-type="type1">Type1Item2</option>
  <option value="Type1Item3" data-type="type1">Type1Item3</option>
  <option value="Type2Item1" data-type="type2">Type2Item1</option>
  <option value="Type2Item2" data-type="type2">Type2Item2</option>
  <option value="Type2Item3" data-type="type2">Type2Item3</option>
</select><br>

Maybe something like the following :

window.onload = function() {
  document.getElementById('ItemTypeSelector').addEventListener('change', function() {
    if (this.value == 'Type1') {
      for (let el of document.getElementsByClassName('Type1')) el.style.display = 'block';
      for (let el of document.getElementsByClassName('Type2')) el.style.display = 'none';
      document.getElementById('ItemSelector').getElementsByTagName('option')[0].selected = 'selected'
    } else {
      for (let el of document.getElementsByClassName('Type1')) el.style.display = 'none';
      for (let el of document.getElementsByClassName('Type2')) el.style.display = 'block';
      document.getElementById('ItemSelector').getElementsByTagName('option')[3].selected = 'selected'
    }
  }, false)
  for (let el of document.getElementsByClassName('Type2')) el.style.display = 'none';
};
<select name="ItemTypeSelector" id="ItemTypeSelector">
  <option value="Type1">Type1</option>
  <option value="Type2">Type2</option>
</select><br>

<select name="ItemSelector" id="ItemSelector">
  <option value="Type1Item1" class="Type1">Type1Item1</option>
  <option value="Type1Item2" class="Type1">Type1Item2</option>
  <option value="Type1Item3" class="Type1">Type1Item3</option>
  <option value="Type2Item1" class="Type2">Type2Item1</option>
  <option value="Type2Item2" class="Type2">Type2Item2</option>
  <option value="Type2Item3" class="Type2">Type2Item3</option>
</select><br>

Related