In this example, I have a series of 3 select drop-downs. The same class ("group-1") is applied to each to indicate that they are related (and to allow for multiple select groups on the same page). The "data-parent" attribute is applied to the select to establish a 1:1 parent/child relationship. The "data-parent" attribute is applied to the option to establish a many:many relationship.
My goal is to create a piece of dynamic jQuery code so that I don't have to explicitly identify behavior by id or class, but rather by option value and data-parent value.
My issues:
- The third drop-down doesn't update at all. I thought it might be that some of them have more than one data-parent value (separated by a space), but even if I change them to all have just one, it still doesn't update with changes to the second drop-down.
- I'm not sure how to implement the "many" data-parent values in the options for the third drop-down. Split the string, create an array, and check to see if the value is in the array?
- How do I reset the second and third drop-downs to the "default" value with a change to the parent drop-down? For example, if I choose "Cookies" from the first, "1 dozen" and "2 dozen" show up in the second. But if I select "1 dozen" and then change the first box to "Cakes", "1 dozen" remains selected even though "Sheet" and "Round" are the only available options in the drop-down. I'd like for it to reset to the default ("Desserts...").
Code is below, and here's my working jsfiddle: https://jsfiddle.net/rwh4z623/20/
$(document).ready(function(){
$(".hide").children("option").hide();
$("select").on('change', function(){
var selClass = $(this).attr("class");
var selName = $(this).attr("name");
var selVal = $(this).children("option:selected").val();
$("select."+selClass+"[data-parent='"+selName+"']").each(function(){
$(this).children("option[data-parent='"+selVal+"']").show();
$(this).children("option[data-parent!='"+selVal+"']").hide();
});
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select class="group-1" name="categories">
<option value="" selected="selected">Please select...</option>
<option value="cookie">Cookies</option>
<option value="cake">Cakes</option>
<option value="icecream">Ice Cream</option>
</select>
<select class="group-1 hide" name="desserts" data-parent="categories">
<option value="" selected="selected">Desserts...</option>
<option value="1-dozen" data-parent="cookie">1 dozen</option>
<option value="2-dozen" data-parent="cookie">2 dozen</option>
<option value="sheet" data-parent="cake">Sheet</option>
<option value="round" data-parent="cake">Round</option>
<option value="pint" data-parent="icecream">Pint</option>
</select>
<select class="group-1 hide" name="flavors" data-parent="desserts">
<option value="" selected="selected">Flavors...</option>
<option value="choc-chip" data-parent="1-dozen 2-dozen">Chocolate Chip</option>
<option value="oatmeal" data-parent="1-dozen 2-dozen">Oatmeal</option>
<option value="yellow" data-parent="sheet round">Yellow</option>
<option value="red-velvet" data-parent="sheet">Red Velvet</option>
</select>
Thanks in advance for any and all help! Also, suggestions on improvements are appreciated.