:submit (since jQuery 1.0) selects elements of type submit — usually <input type="submit"> and <button type="submit">. Official docs: always set a type on <button> so browsers agree on whether it submits.
Remember
$(":submit") // submit controls
$("input:submit") // input submit only
$("form :submit") // scoped to a form
$("td :submit") // official demo style
// Native / faster (official tip):
$('input[type="submit"], button[type="submit"]')
// Always set type on <button> for consistent matching
Scope to a form or cell, count or style matches, and always declare type on buttons.
Write $("form :submit") or $("input:submit") instead of a vague bare scan when possible.
Give every <button> an explicit type="submit" or type="button".
Style, disable, or bind clicks with normal jQuery methods.
Prevent accidental navigations in demos with $("form").on("submit", …) and preventDefault().
For hot paths, use the official attribute selector list instead of :submit.
Piece
Required?
Role
Selector string
Yes
:submit filter (best with a context)
Form / cell context
Recommended
Limits matches to one region
type on <button>
Strongly recommended
Cross-browser submit behavior
Return value
—
jQuery collection of matching submit controls
Pseudocode
Pseudocode
matches = []
for each element in search context:
if element is a submit control
(input type=submit, or button that submits):
matches.add(element)
return matches
// Safer markup:
button elements always have an explicit type
Reference
Cheat Sheet
Keep these facts handy while selecting submit controls.
Topic
Detail
Syntax
$(":submit") / $("input:submit")
Since
jQuery 1.0 · jQuery extension
Matches
Submit input / button controls
vs :reset
Send form vs clear form
vs :button
Submit action vs generic button
Markup tip
Always set type on <button>
Native CSS
input[type=submit], button[type=submit], …
Official demo
$("td :submit") then style parent cells
Try it
Live Preview
Run different selectors against a small sample form and see how many submit controls match.
Sample includes input submit, button submit, reset, and plain buttons — similar to the official form demos.
Standard CSS. Attribute selectors work in querySelectorAll.
Same set. With explicit types, counts match :submit.
Docs tip. Add button:not([type]) only if you must support typeless buttons.
When. Prefer this form on large pages or frequent re-queries.
Edge Cases & Pitfalls
Check these before relying on :submit in real forms.
type
Bare <button> is inconsistent
Official docs: some browsers imply type="submit", others do not. Always set type explicitly.
non-std
Not valid in querySelectorAll(":submit")
Use input[type="submit"], button[type="submit"] for native CSS queries.
overlap
:button can also match
A <button type="submit"> matches both :button and :submit. Prefer the selector that matches your intent.
scope
Many forms on one page
Bare $(":submit") hits every form. Scope with $("#signup :submit").
Compatibility
Browser Support
The :submit pseudo-class is a jQuery extension and has worked since jQuery 1.0. Prefer attribute selectors for native querySelectorAll performance, and always set type on <button> elements.
✓ jQuery 1.0+ · extension
jQuery :submit Selector
Supported across jQuery 1.x, 2.x, and 3.x wherever your jQuery build runs. Prefer :submit for convenience; use attribute selectors for native speed.
100%jQuery + native attr
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
:submitUniversal
Bottom line: Safe everywhere jQuery runs. Scope to a form, set button types explicitly, and prefer attribute selectors when performance matters.
Analysis
Performance Notes
Approach
Cost
Best for
$('input[type="submit"], button[type="submit"]')
Fastest
Modern browsers / hot paths
$("form :submit")
Cheap
Typical forms
$("input:submit")
Cheap
Input-only markup
$(":submit")
Slower
Avoid on large pages
Official docs: because :submit is not CSS, it cannot use the querySelectorAll boost. Prefer the documented attribute selector list when you re-query often.
Speed: prefer attribute selectors; next topic is :root.
One line:$(":submit") finds form submit controls — set button types explicitly, scope to a form, and use attribute selectors when you need native speed.
Frequently Asked Questions
:submit selects every form control of type submit — typically input[type="submit"] and button[type="submit"]. Official docs note it applies to button or input elements. Available since jQuery 1.0.
:submit matches controls that submit the form. :button matches button elements and input[type="button"]. A <button type="submit"> can match both :button and :submit; input[type="submit"] matches :submit, not :button.
Yes. Official docs warn that some browsers treat <button> as type="submit" implicitly while others (historically IE) do not. Always set type="submit" or type="button" for consistent markup and matching.
Official docs recommend input[type="submit"], button[type="submit"], button:not([type]) for querySelectorAll performance instead of the jQuery :submit extension.
:submit matches controls that send the form. :reset matches type=reset controls that restore default field values. They never overlap for a single control’s type.
No. It is a jQuery extension, so it cannot use the native querySelectorAll boost. Prefer the attribute selectors listed in the docs when performance matters.