Easy way to quick select a whole optgroup in select box

前端 未结 4 984
星月不相逢
星月不相逢 2021-01-02 20:32

I have a select box in which i can select multiple options. In the select box are multiple optgroups. Is there an easy way to select a whole optgroup at once in javascript?

相关标签:
4条回答
  • 2021-01-02 20:45

    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...

    0 讨论(0)
  • 2021-01-02 20:51

    jquery:

    $('#myoptgroup option').attr('selected', true);
    
    0 讨论(0)
  • 2021-01-02 20:52

    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.

    0 讨论(0)
  • 2021-01-02 21:00

    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:

    <script type="text/javascript">
    
    function selectOptGroupOptions(optGroup, selected) {
        var options = optGroup.getElementsByTagName("option");
        for (var i = 0, len = options.length; i < len; i++) {
            options[i].selected = selected;
        }
    }
    
    function selectOptGroup(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>
    
    <select id="veg" multiple>
        <optgroup label="roots">
            <option>Swede</option>
            <option>Carrot</option>
            <option>Turnip</option>
        </optgroup>
        <optgroup label="leaves">
            <option>Spinach</option>
            <option>Kale</option>
        </optgroup>
    </select>
    
    <input type="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.

    0 讨论(0)
提交回复
热议问题