On page load I am trying to unhide multiple dropdowns in a div if any of the dropdowns have an option selected

Viewed 40

I have five hidden drop-downs in a div that are dynamically populated with an option selected if required by the data.

I need to display the drop-downs that have an option selected but not if the value is 0.

My code tried so far:

$('.sendingCriteria').each(function () {
    $(':selected', this).each(function (e) {
        let $this = $(this);
        if ($this.value() != 0) {
            $(this).css('display', 'block');
        }
    });
});

The CSS:

.timeOfDay,.dayOfWeek,.dayOfMonth,.mnthOfYr{
    display: none;
}

.freqSelectors{
    display:none;
}

The HTML:

<div class="sendingCriteria">
    <div class="clearfix">
        <span class="bi bi-question-circle-fill" data-help="help5"></span>
        <div class="manualAuto">
            <div class="form-check form-switch manAuto">
                <input class="form-check-input" type="checkbox" name="manAuto" id="manAuto" value="1" checked="checked">
            </div>
        </div>
        <div class="freqSelectors">
            <div class="freq">
                <label class="form-label" for="frequency">Frequency</label>
                <select id="frequency" name="frequency" class="form-select" aria-label="Select Frquency">
                    <option value="0">-- Select --</option><option value="d" selected="selected">Daily</option><option value="w">Weekly</option><option value="m">Monthly</option><option value="a">Annually</option>
                </select>
            </div>
            <div class="timeOfDay Daily Weekly Monthly Annually">
                <label class="form-label" for="timeOfDay">Time of Day</label>
                <select id="timeOfDay" name="timeOfDay" class="form-select" aria-label="Select Time">
                    <option value="0">-- Select --</option><option value="1">01:00</option><option value="2">02:00</option><option value="3">03:00</option><option value="4">04:00</option><option value="5">05:00</option><option value="6">06:00</option><option value="7">07:00</option><option value="8">08:00</option><option value="9">09:00</option><option value="10">10:00</option><option value="11">11:00</option><option value="12">12:00</option><option value="13">13:00</option><option value="14">14:00</option><option value="15" selected="selected">15:00</option><option value="16">16:00</option><option value="17">17:00</option><option value="18">18:00</option><option value="19">19:00</option><option value="20">20:00</option><option value="21">21:00</option><option value="22">22:00</option><option value="23">23:00</option><option value="24">24:00</option>
                </select>
            </div>
            <div class="dayOfWeek Weekly Annually">
                <label class="form-label" for="dayOfWeek">Day of the Week</label>
                <select id="dayOfWeek" name="dayOfWeek" class="form-select">
                    <option value="0" selected="selected">-- Select --</option><option value="1">Monday</option><option value="2">Tuesday</option><option value="3">Wednesday</option><option value="4">Thursday</option><option value="5">Friday</option><option value="6">Saturday</option><option value="7">Sunday</option><option value="9">Week Day</option><option value="10">Weekend</option>
                </select>
            </div>
            <div class="dayOfMonth Monthly Annually">
                <label class="form-label" for="dayOfMonth">Day of the Month</label>
                <select id="dayOfMonth" name="dayOfMonth" class="form-select" aria-label="Select Month">
                    <option value="0" selected="selected">-- Select --</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="21">21</option><option value="22">22</option><option value="23">23</option><option value="24">24</option><option value="25">25</option><option value="26">26</option><option value="27">27</option><option value="28">28</option><option value="29">29</option><option value="30">30</option><option value="31">31</option><option value="32">Last day</option><option value="33">First Monday</option><option value="34">First Tuesday</option><option value="35">First Wednesday</option><option value="36">First Thurday</option><option value="37">First Friday</option><option value="38">First Saturday</option><option value="39">First Sunday</option>
                </select>
            </div>
            <div class="mnthOfYr Annually">
                <label class="form-label" for="dmnthOfYr">Month of the Year</label>
                <select id="dmnthOfYr" name="dmnthOfYr" class="form-select">
                    <option value="0" selected="selected">-- Select --</option><option value="1">January</option><option value="2">February</option><option value="3">March</option><option value="4">April</option><option value="5">May</option><option value="6">June</option><option value="7">July</option><option value="8">August</option><option value="9">September</option><option value="10">October</option><option value="11">November</option><option value="12">December</option>
                </select>
            </div>
        </div>
    </div>
    <div class="help help5" style="display: none;">Choose the frequency for generating this notificaton</div>
</div>
1 Answers

As I understand it, you're trying to show/hide individual select elements, but your CSS hides div.freqSelectors which contains all of them. That means showing an individual select will have no effect, because the parent div is still hidden. So let's remove that CSS.

Next, your code is trying to iterate over $(':selected', this). But in this context, the this you reference is .sendingCriteria, which is a div. That will have no selected elements, so that will never match anything.

Instead, let's keep it simple - just iterate over each select in this container. We can find those using .find(), which will search down the DOM for matching elements.

We test each value, same as your code, but since it is the div containing the select that is hidden, we need to target that to unhide it, not the select itself. We can use .closest() to do that, it will search back up the DOM to find the closest matching element.

Note your code is iterating over every .sendingCriteria on the page. Are there really more than 1? If not, you can remove that entire loop, and just find the selects inside that element, like:

let $selects = $('.sendingCriteria').find('select');

Working snippet below (with much simplified HTML - we can demonstrate the functionality with a minimal subset of the HTML you included).

$('.sendingCriteria').each(function () {
    let $selects = $(this).find('select');
    $selects.each(function() {
        if ($(this).val() != 0) {
            $(this).closest('div').css('display', 'block');
        }
    });
});
.timeOfDay,.dayOfWeek,.dayOfMonth,.mnthOfYr{
    display: none;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="sendingCriteria">
    <div class="freqSelectors">
        <div class="freq">
            <label class="form-label" for="frequency">Frequency</label>
            <select id="frequency" name="frequency" class="form-select" aria-label="Select Frquency">
                <option value="0">-- Select --</option>
                <option value="d" selected="selected">Daily</option>
                <option value="w">Weekly</option>
                <option value="m">Monthly</option>
                <option value="a">Annually</option>
            </select>
        </div>
        <div class="timeOfDay Daily Weekly Monthly Annually">
            <label class="form-label" for="timeOfDay">Time of Day</label>
            <select id="timeOfDay" name="timeOfDay" class="form-select" aria-label="Select Time">
                <option value="0">-- Select --</option>
                <option value="14">14:00</option>
                <option value="15" selected="selected">15:00</option>
                <option value="16">16:00</option>
            </select>
        </div>
        <div class="dayOfWeek Weekly Annually">
            <label class="form-label" for="dayOfWeek">Day of the Week</label>
            <select id="dayOfWeek" name="dayOfWeek" class="form-select">
                <option value="0" selected="selected">-- Select --</option>
                <option value="1">Monday</option>
                <option value="2">Tuesday</option>
            </select>
        </div>
    </div>
</div>

Related