:selected (since jQuery 1.0) matches <option> elements that are currently selected in a <select>. Official docs: it does not work for checkboxes or radios — use :checked for those.
Remember
$("option:selected") // selected options
$("select option:selected") // official-style scope
$("#city option:selected").text() // visible label
$("#city").val() // value attribute (simpler)
// Not for checkboxes / radios → use :checked
// Faster pattern:
$("#city option").filter(":selected")
Scope to a select, read text or value on change, and re-query after the user picks a new option.
Prefer $("select option:selected") or an id-scoped query.
Bind change on the <select> so results stay current.
Use .text() for the label, .val() on the select for the value.
For multi-select, loop option:selected (official demo pattern).
For speed: $("#id option").filter(":selected") (official tip).
Piece
Required?
Role
Selector string
Yes
:selected (best with an option / select prefix)
<select> context
Recommended
Limits matches to one dropdown
change handler
Optional
Refresh labels/values after user input
Return value
—
jQuery collection of selected <option>s (0+)
Pseudocode
Pseudocode
matches = []
for each option in search context:
if option is currently selected:
matches.add(option)
return matches
// Official change pattern:
on select.change:
texts = map(matches, option → option.text)
show(texts)
Reference
Cheat Sheet
Keep these facts handy while reading dropdown selections.
Topic
Detail
Syntax
$("option:selected")
Since
jQuery 1.0 · jQuery extension
Matches
Selected <option> elements only
Not for
Checkboxes / radios (use :checked)
Label vs value
.text() vs select.val()
Multi-select
Zero or more options may match
Live state
Reflects current selection, not only HTML
Performance
$("option").filter(":selected")
Try it
Live Preview
Change the dropdown (or multi-select), then read option:selected text — same idea as the official demo.
Mirrors the official jQuery garden options list. Multi-select shows several :selected matches.
Result
$("select option:selected")
single: Shrubs
multi: Flowers Trees
count: 3
/* official change-demo idea */
Code
jQuery Examples
Short, copy-ready snippets. Open DevTools Console with jQuery loaded, or use Try It Yourself for a live editor.
Example 1 — Official Demo: option:selected on Change
Collect selected option text whenever the dropdown changes (jQuery API example).
CSS first.$("#menu option") can use native querySelectorAll.
Filter..filter(":selected") keeps only selected options.
Same result. You still get the chosen option(s).
Why. Official docs recommend this because :selected is not standard CSS.
Edge Cases & Pitfalls
Check these before relying on :selected in real forms.
wrong type
Not for checkboxes or radios
Official docs: use :checked for those controls. :selected is for <option> only.
non-std
Cannot use bare in querySelectorAll
:selected is a jQuery extension. Prefer $("option").filter(":selected") for better performance.
scope
Many selects on one page
Bare $("option:selected") matches every dropdown. Scope with an id: $("#city option:selected").
empty
Multi-select can have zero selected
Length can be 0. Check before reading .text() or submitting.
Compatibility
Browser Support
The :selected pseudo-class is a jQuery extension and has worked since jQuery 1.0. Selected state on options is standard DOM behavior; use .filter(":selected") after a CSS option query as the docs recommend.
✓ jQuery 1.0+ · extension
jQuery :selected Selector
Supported across jQuery 1.x, 2.x, and 3.x wherever your jQuery build runs. Prefer option:selected or .filter(":selected").
100%Form selector support
Google ChromeAll versions · Desktop & Mobile
Full support
Mozilla FirefoxAll versions · Desktop & Mobile
Full support
Apple SafariAll versions · macOS & iOS
Full support
Microsoft EdgeAll versions · Chromium & Legacy
Full support
Internet ExplorerIE 6+ · Legacy environments
Full support
OperaAll modern versions
Full support
:selectedUniversal
Bottom line: Safe everywhere jQuery runs. Scope to a select, use :checked for checkboxes/radios, and prefer .filter(":selected") on large pages.
Analysis
Performance Notes
Approach
Cost
Best for
$("#id option").filter(":selected")
Best
Official recommended pattern
$("#id option:selected")
Cheap
Small forms / tutorials
$("#id").val()
Cheapest
Reading value only (no label text)
$(":selected")
Slower
Avoid — universal scan
Official docs: because :selected is not CSS, it cannot use querySelectorAll. Select options with a pure CSS selector first, then .filter(":selected").
Remember
Key Takeaways
Role: match currently selected <option> elements.
Not checkboxes: use :checked for boxes and radios.
Change: re-query on change; trigger once for the initial label.
Speed:$("option").filter(":selected"); values via .val().
One line:$("select option:selected") reads dropdown choices — not checkboxes — and pairs best with change plus .filter(":selected") when performance matters.
Frequently Asked Questions
:selected matches every option element that is currently selected inside a select dropdown. Official jQuery docs: it works for option elements. Available since jQuery 1.0.
No. Official docs state that :selected does not work for checkboxes or radio inputs — use :checked for those control types instead.
:selected targets selected option elements in a select. :checked matches ticked checkboxes, selected radios, and can also match options. Prefer option:selected when you only care about dropdown selections.
Bind change on select, loop $("select option:selected").each() to collect option text, write it to a div, then .trigger("change") for the initial draw — as in the jQuery API docs.
Use $("#mySelect").val() for the value attribute, or $("#mySelect option:selected").text() for the visible label. Both read the current selection after the user changes the dropdown.
Because :selected is a jQuery extension, first select options with a CSS selector then narrow with .filter(":selected") — for example $("#mySelect option").filter(":selected").