.change() is jQuery’s legacy shorthand for binding or triggering the form change event on input, select, and textarea elements. Binding is deprecated since 3.3; modern code uses .on("change") / .trigger("change").
Remember
// Legacy (still works; bind form deprecated since 3.3)
$("#country").change(function () {
// value changed
});
// Modern replacements
$("#country").on("change", handler); // bind
$("#country").trigger("change"); // fire
// .val() does NOT fire change — trigger after script updates
$("#country").val("US").trigger("change");
Trigger with no-arg .change() (legacy) or .trigger("change") (preferred).
After .val(), always trigger manually — script updates do not fire change.
For dynamic fields, use delegated .on("change", selector, fn) — not .change().
Piece
Required?
Role
handler
For bind form
function(event) — runs when the value changes
eventData
Optional (1.4.3+)
Extra data available as event.data
No-arg call
For trigger
Fires change on each matched element
Target elements
Yes
input, select, textarea
Pseudocode
Pseudocode
// Legacy
call element.change(handler)
→ bind "change" on element
call element.change()
→ trigger "change" on element
// Modern (jQuery 1.7+)
call element.on("change", handler)
when user changes value (select: immediate; text: on blur):
fire "change" on element
call handler(event)
when script sets value with .val():
change does NOT fire
call element.trigger("change") if handlers must run
to migrate:
.change(fn) → .on("change", fn)
.change(data, fn) → .on("change", data, fn)
.change() → .trigger("change")
Reference
Cheat Sheet
Quick map from the shorthand to modern APIs.
Topic
Detail
Legacy bind
$("select").change(handler) ⚠ deprecated 3.3
Modern bind
$("select").on("change", handler)
Legacy trigger
$("select").change()
Modern trigger
$("select").trigger("change")
After .val()
$("#tier").val("pro").trigger("change")
Init on load
.on("change", fn).trigger("change")
Unbind
$("select").off("change" [, handler])
Since / status
1.0 · eventData 1.4.3 · bind deprecated 3.3
Timing
Select/checkbox: immediate · text: on blur if value changed
Try it
Live Preview
Pick an action against a sample select. The demo uses .change() (still available in jQuery 3.x) so you can see bind vs trigger.
Demo select: Free / Pro / Enterprise — compare silent .val() vs trigger.
Result
Ready — pick an action and click Run.
Code
jQuery Examples
Short, copy-ready snippets. Prefer .on("change") for new projects; these demos show the legacy API you will still meet in older code.
Example 1 — Basic .change(handler)
Update a label when the user picks a new dropdown option.
Click #set-pro
.val("pro") alone would not update #out
.val("pro").change() → "Tier is now: pro"
How It Works
Bind. The handler is registered first.
Silent set..val("pro") updates the control without firing change.
Trigger. No-arg .change() runs bound handlers.
Prefer. Use .trigger("change") in new code.
Example 4 — Migrate to .on("change")
Both bind the same event — .on() is the recommended API for new code.
jQuery
$("#legacy").change(function () {
$("#out").text("Legacy: .change(fn) — deprecated since 3.3.");
});
$("#modern").on("change", function () {
$("#out").text("Modern: .on('change', fn) — use this for new code.");
});
Watch for these when reading or migrating legacy .change() code.
deprecated
Bind form deprecated since 3.3
Still works in jQuery 3.x, but new code should use .on("change").
.val()
.val() does not fire change
Script updates stay silent. Chain .trigger("change") (or legacy .change()) when handlers must run.
timing
Text inputs wait for blur
Selects and checkboxes fire immediately; text fields fire on blur only if the value changed.
delegation
No built-in delegation
.change(fn) cannot target future elements. Use $("#form").on("change", "select", fn).
Compatibility
Browser Support
The underlying change event is a standard DOM form event. The .change() method is a jQuery API available since 1.0 (eventData since 1.4.3). Binding via .change(handler) is deprecated since 3.3 but still functional in jQuery 3.x.
✓ Deprecated · jQuery 3.3
jQuery .change()
Works in jQuery 1.x–3.x. Prefer .on('change') / .trigger('change') for new projects. Native equivalent: addEventListener('change', fn).
100%With jQuery loaded
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
.change()Legacy API
Bottom line: Safe in legacy projects. Migrate bindings to .on('change') and triggers to .trigger('change') when you touch form scripts.
Analysis
Performance Notes
Approach
Cost
Best for
Direct .on("change") on known fields
Cheap
Static forms and dropdowns
Delegated .on("change", selector, fn)
Cheap
Dynamic rows / AJAX-injected fields
Heavy work inside every change
Expensive
Avoid — keep handlers light
The shorthand and .on("change") cost the same for a single bind. Prefer .on() for clarity and delegation. Keep the callback light — update a label or toggle a class, then stop.
Remember
Key Takeaways
Role: legacy bind/trigger for form value changes.
Migrate:.on("change", fn) and .trigger("change").
.val() trap: script updates need an explicit trigger.
Delegation: only available via .on("change", selector, fn).
One line:.change() is deprecated sugar for .on("change") / .trigger("change") — migrate when you touch the file.
Frequently Asked Questions
The .change() method has two roles. With a handler — .change(handler) or .change(eventData, handler) — it binds a function that runs when an input, select, or textarea value changes. With no arguments — .change() — it triggers the change event on each matched element. Binding has been part of jQuery since 1.0 and is deprecated since 3.3.
Yes. The binding signatures .change(handler) and .change(eventData, handler) are deprecated since jQuery 3.3. Use .on("change", handler) instead. The no-argument .change() trigger still works, but .trigger("change") is clearer. Legacy code continues to run in jQuery 3.x.
.change(handler) registers a callback and does not fire immediately. .change() with no arguments triggers the change event — the same as .trigger("change"). Check whether parentheses contain a function before reading legacy code.
Replace .change(fn) with .on("change", fn). Replace .change(data, fn) with .on("change", data, fn). Replace no-arg .change() with .trigger("change"). Cleanup with .off("change"). Under the hood, .change(handler) already delegates to .on("change").
No. Setting a value with .val("new") does not fire change — whether you bound with .change(fn) or .on("change", fn). After programmatic updates, call .change() or .trigger("change"): $("#country").val("US").trigger("change").
No. Direct .change(fn) only binds to elements that already match. For dynamic fields, use .on("change", "select", fn) on a parent. That is one reason to prefer .on() over the shorthand.