28

I wonder if it's possible in Javascript to get the currently selected options in a <select multiple> field using the Selctors API rather than a "stupid" iteration over all options.

select.querySelectorAll('option[selected="selected"]') only returns the options that were marked as preselected in the original HTML, which is not what I'm looking for. Any ideas?

GOTO 0
  • 28,453
  • 18
  • 97
  • 127
  • I think your only option is to iterate over all `option` elements and filter out the ones that are not selected. – Felix Kling Mar 23 '13 at 12:16

2 Answers2

56

document.querySelectorAll('option:checked')

Works even on IE9 ;)

a better oliver
  • 24,069
  • 2
  • 48
  • 59
1

I was also experienced your issue, I have a feeling it's to do with JavaScript not recognising changes in the DOM.

Here is a solution:

jsFiddle

document.getElementById('test').onclick = function () {
    var select = document.getElementById('select');
    var options = getSelectedOptions(select);
    console.log(options);
};

function getSelectedOptions(select) {
    var result = [];
    var options = select.getElementsByTagName('option');
    for (var i = 0; i < options.length; i++) {
        if (options[i].selected)
            result.push(options[i]);
    };
    return result;
}
Daniel Imms
  • 43,032
  • 14
  • 130
  • 152
  • JS recognizes these changes to the DOM. The problem is that the `selected` DOM property is non-serializable. The `selected` attribute corresponds to the `defaultSelected` DOM property, so querying for the attribute as in `[selected]` will return elements that have `defaultSelected` DOM property set to `true`. – Fabrício Matté Jul 14 '13 at 06:38