Major Changes Introduced in jQuery 3.0
jQuery 3.0 was released as a major overhaul designed to modernize the popular JavaScript library, improve performance, and align with current web standards. This version shed legacy browser workarounds, adopted ECMAScript 2015 (ES6) conventions, altered the internal handling of promises, and introduced a lighter alternative build for modern workflows. Below is a breakdown of the most significant changes, deprecations, and new features introduced in this release.
Promises/A+ Compatibility in jQuery.Deferred
In jQuery 3.0, jQuery.Deferred objects were updated to
be fully compliant with the Promises/A+ specification. Previously,
jQuery's Deferred implementation differed from native JavaScript
Promises. With 3.0:
- Callbacks attached via
.then()are always executed asynchronously, even if the Deferred object is already resolved. - Exceptions thrown inside a
.then()callback are caught and converted into a rejected promise, rather than bubbling up and stopping execution.
Introduction of the jQuery Slim Build
A new "slim" package was introduced for developers who do not require animations or built-in Ajax functionality. The slim build excludes:
- The Ajax module (
$.ajax,$.get,$.post). - The effects/animation module (
animate,fade,slide). - Deprecated code modules.
This reduced the gzipped file size substantially, making it popular for integration with modern utility frameworks and build tools where developers use the native Fetch API or external libraries for HTTP requests.
Animation Performance with requestAnimationFrame
jQuery 3.0 integrated the standard requestAnimationFrame
API for animations on browsers that support it. This replaced
interval-based timers (setInterval), resulting in:
- Smoother, 60fps animations that sync with browser paint cycles.
- Reduced CPU consumption and battery drain, as animations automatically pause when browser tabs are inactive or hidden.
Simplified show() and hide() Methods
To make jQuery behave more predictably with external CSS stylesheets
and responsive design, the mechanics of .show() and
.hide() were simplified. Previous versions tracked and
restored the inline display style dynamically, often
conflicting with media queries. In jQuery 3.0, .hide()
simply sets display: none inline, and .show()
clears that inline style, allowing the stylesheet’s rules to dictate the
display property.
Updated HTML5 data-* Attribute Handling
The .data() method was aligned with the HTML5 dataset
specification regarding kebab-case and camelCase attributes. All keys
are converted to camelCase:
- A tag with
data-page-index="1"is stored aspageIndex. - Accessing
$(el).data("page-index")or$(el).data("pageIndex")accesses the exact same property, avoiding duplicate entries in the internal data cache.
Support for ES2015 for...of Loops
jQuery objects in version 3.0 implement the iterable contract introduced in ES6/ES2015. Developers can loop directly over elements in a jQuery collection using modern native loops:
for (let element of $("div")) {
// element is the native DOM node
}Removal of Deprecated Methods
Several legacy and deprecated methods were completely removed to clean up the API:
- Event shorthands:
.load(),.unload(), and.error()were removed to eliminate ambiguity with Ajax methods and modernize event binding (use.on("load", ...)instead). - DOM helpers:
.size()was removed in favor of the.lengthproperty. - Internal utilities:
jQuery.parseJSON()was deprecated in favor of nativeJSON.parse(). - Context and selector properties: Properties like
$(...).contextand$(...).selectorwere removed as they were fragile and poorly standardized.
Improved SVG Support
While jQuery 3.0 did not implement full SVG manipulation, it updated
class manipulation methods (.addClass(),
.removeClass(), and .hasClass()) to work
correctly on SVG elements, removing the need for third-party workarounds
for standard SVG styling.