Easy Way To Quick Select A Whole Optgroup In Select Box
Solution 1:
I suggest using jQuery (or another framework) to quickly handle DOM selections. Give each optgroup a class to make it easier to grab it.
$("optgroup.className").children().attr('selected','selected');
If you want to select the entire group based on the user selecting the group, do the following:
$("optgroup.className").select(function(e) {
$(this).children().attr('selected','selected');
});
**Both examples are untested pseudo-code, but they should work with minimal changes, if necessary.
If you cannot use a framework, you'll have to traverse the DOM yourself to find the optgroup and children. You could attach a listener to the select
element to grab the element being selected then traverse to the children that way, too.
Solution 2:
I'm normally against using jQuery for simple jobs like this but I can see its value here. Still, if you prefer a non-jQuery solution that will have the benefits of using no library, introducing no spurious ids or classes and running faster, here is one:
<scripttype="text/javascript">functionselectOptGroupOptions(optGroup, selected) {
var options = optGroup.getElementsByTagName("option");
for (var i = 0, len = options.length; i < len; i++) {
options[i].selected = selected;
}
}
functionselectOptGroup(selectId, label, selected) {
var selectElement = document.getElementById(selectId);
var optGroups = selectElement.getElementsByTagName("optgroup");
var i, len, optGroup;
for (i = 0, len = optGroups.length; i < len; i++) {
optGroup = optGroups[i];
if (optGroup.label === label) {
selectOptGroupOptions(optGroup, selected);
return;
}
}
}
</select>
<selectid="veg"multiple><optgrouplabel="roots"><option>Swede</option><option>Carrot</option><option>Turnip</option></optgroup><optgrouplabel="leaves"><option>Spinach</option><option>Kale</option></optgroup></select><inputtype="button"onclick="selectOptGroup('veg', 'roots', true)"value="Select roots">
If your <optgroup>
has an id you could do away with the selectOptGroup
function and just pass the optgroup straight into selectOptGroupOptions
.
Solution 3:
jquery:
$('#myoptgroup option').attr('selected', true);
Solution 4:
I was trying to do something similar just now.
I wanted to select an <optgroup>
's <option>
s upon clicking the group's label. The first attempt went like this:
$('select > optgroup').click(function () {
$(this).children().attr('selected', true);
});
This solution half worked...
Upon clicking the <optgroup>
's label all of its children became selected.
BUT when simply clicking an <option>
it was still selecting all the other <option>
s in the group! The problem was event bubbling, because the <option>
is inside the <optgroup>
technically you're clicking it too.
Therefore the final piece of the puzzle was to suppress the event bubbling upwards in the event that an <option>
was actually clicked instead. The final solution then became:
$('select > optgroup').click(function () {
$(this).children().attr('selected', true);
});
$('select > optgroup > option').click(function (e) {
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
});
Job done!
EDIT
Infuriatingly this doesn't work work in IE8 (and doubtful < IE8 - maybe IE9?)...
It decides to totally ignore click events on both and elements. The only alternative that I can think of is to position elements above the optgroup labels to capture the click, but its probably not worth the effort...
Post a Comment for "Easy Way To Quick Select A Whole Optgroup In Select Box"