How to hide div if depending on dropdown option selected

Viewed 176

I'm new to programming and wanted to learn some JavaScript logic. Currently, I know how to hide a div based on one option, but how can I hide it based on multiple? I have tried using doing document.getElementById(divId).style.display = element.value != 'None' && 'Refuse to answer' ? 'block' : 'none'; by using the && operator, but it didn't work. Thanks for your help in advance!

Current funtionality: Div shows for every option except None

Expected funtionality: Div shows for every option selected except None and Refuse to answer

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>

  <style type="text/css">
  #hidden_div {
    display: none;
  }
</style>
</head>
<body>
  <label>What is your favorite color?</label>
  <select id="test" name="form_select" onchange="showDiv('hidden_div', this)">
   <option value="None">None</option>
   <option value="Refuse to answer">Refuse to answer</option>
   <option value="Red">Red</option>
   <option value="Blue">Blue</option>
   <option value="Green">Green</option>
   <option value="Yellow">Yellow</option>
   <option value="Purple">Purple</option>
   <option value="White">White</option>
   <option value="Pink">Pink</option>
   <option value="Black">Black</option>
 </select>
 
 <div id="hidden_div">
  <p>hello</p> 
</div>

</body>
<script type="text/javascript">
  function showDiv(divId, element)
  {
    document.getElementById(divId).style.display = element.value != 'None' ? 'block' : 'none';
  }
</script>
</html>
4 Answers

When you do the comparison:

element.value != 'None' && 'Refuse to answer'

It will always evaluate to true if element.value is not 'None'. This is because any non-empty string evaluates to true, and since 'Refuse to answer' is not an empty string, it will evaluate to true.

Instead, you need to compare the value property again:

element.value != 'None' && element.value != 'Refuse to answer'

Demo:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>

  <style type="text/css">
  #hidden_div {
    display: none;
  }
</style>
</head>
<body>
  <label>What is your favorite color?</label>
  <select id="test" name="form_select" onchange="showDiv('hidden_div', this)">
   <option value="None">None</option>
   <option value="Refuse to answer">Refuse to answer</option>
   <option value="Red">Red</option>
   <option value="Blue">Blue</option>
   <option value="Green">Green</option>
   <option value="Yellow">Yellow</option>
   <option value="Purple">Purple</option>
   <option value="White">White</option>
   <option value="Pink">Pink</option>
   <option value="Black">Black</option>
 </select>
 
 <div id="hidden_div">
  <p>hello</p> 
</div>

</body>
<script type="text/javascript">
  function showDiv(divId, element)
  {
    document.getElementById(divId).style.display = element.value != 'None' && element.value != 'Refuse to answer' ? 'block' : 'none';
  }
</script>
</html>


Or even better, store the valid values in an array, and check whether it includes the value property in the if statement:

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title></title>

  <style type="text/css">
    #hidden_div {
      display: none;
    }
  </style>
</head>

<body>
  <label>What is your favorite color?</label>
  <select id="test" name="form_select" onchange="showDiv('hidden_div', this)">
    <option value="None">None</option>
    <option value="Refuse to answer">Refuse to answer</option>
    <option value="Red">Red</option>
    <option value="Blue">Blue</option>
    <option value="Green">Green</option>
    <option value="Yellow">Yellow</option>
    <option value="Purple">Purple</option>
    <option value="White">White</option>
    <option value="Pink">Pink</option>
    <option value="Black">Black</option>
  </select>

  <div id="hidden_div">
    <p>hello</p>
  </div>

</body>
<script type="text/javascript">
  const validValues = ['None', 'Refuse to answer'];

  function showDiv(divId, element) {
    document.getElementById(divId).style.display = !validValues.includes(element.value) ? 'block' : 'none';
  }
</script>

</html>

Your syntax for ternary expression is a bit incorrect, you compare element.value != 'None' AND a string 'Refuse to answer', the condition for Refuse to answer will always return true because it's a string, so you should change it to element.value != 'Refuse to answer'

according to your expectation:

Expected funtionality: Div shows for every option selected except None and Refuse to answer

The solution for this problem is:

document.getElementById(divId).style.display = element.value != 'None' && element.value != 'Refuse to answer' ? 'block' : 'none';

If you want the code to be cleaner, you could use Array.includes();

["none", "wontsay"].includes(option) ? "none" : "block";

Try next code:

function showDiv(divId, element)
{
  var currentValue = element.value

  document.getElementById(divId).style.display = (
    currentValue  !== 'None' &&
    currentValue  !== 'Refuse to answer'
  ) ? 'block' : 'none';

}
Related