Why jQuery Replaced $.browser with $.support
In early versions of web development, detecting which browser a
visitor used was the standard approach to handling cross-browser quirks,
leading jQuery to provide the $.browser property. However,
jQuery deprecated $.browser in version 1.3 and completely
removed it in version 1.9, replacing its underlying philosophy with
$.support. This transition represented a fundamental
paradigm shift from unreliable "browser sniffing" (relying on the
User-Agent string) to "feature detection" (testing whether a browser
actually supports a specific capability), dramatically improving code
resilience and forward compatibility.
The Problem with
$.browser and Browser Sniffing
The $.browser property relied directly on reading
navigator.userAgent. This approach—commonly known as
browser sniffing—had several severe flaws:
- User-Agent Spoofing: Browsers often impersonated other browsers in their User-Agent strings for compatibility reasons. For example, early Chrome included mentions of Safari, WebKit, and Mozilla to ensure websites served standard-compliant code. This made parsing the string prone to false positives.
- Fragility on Updates: Browser sniffing assumed that all versions of a browser shared the same bugs or missing features. When a browser vendor patched an issue in a minor update or released a major upgrade, code targeting older versions frequently broke or applied unnecessary workarounds.
- Maintenance Overhead: Developers had to maintain exhaustive lists of browser names and versions, updating their conditions every time a new browser or version entered the market.
The Solution:
Feature Detection with $.support
Rather than guessing capabilities based on an identity string,
$.support introduced direct feature detection.
Feature detection tests a specific behavior in the execution
environment before attempting to use it. Instead of asking, "Is this
browser Internet Explorer 8?", jQuery used $.support
to ask, "Does the current environment support standard event
listeners, opacity, or CORS?"
To achieve this, $.support ran a series of small,
isolated tests when the library initialized:
- It created dummy elements in memory.
- It applied specific styles, attributes, or methods to those elements.
- It inspected the result to determine whether the browser handled the operation correctly.
- It stored the boolean outcome (e.g.,
$.support.opacity = true) for later use.
Why the Shift Mattered
Moving to feature detection via $.support provided
several immediate benefits for developers:
- Forward Compatibility: Code written with feature
tests automatically worked in future browser releases. If a future
browser added support for a previously unsupported API, the test
automatically evaluated to
truewithout needing a library update. - Resilience: Feature detection is immune to User-Agent spoofing, custom browser skins, and unexpected version-string formatting.
- Best Practices: It encouraged developers to write clean, modular fallbacks instead of hardcoding version-specific hacks.
While jQuery eventually deprecated $.support in jQuery
1.9—advising developers to use dedicated tools like Modernizr or write
their own targeted tests—the shift away from $.browser
established feature detection as the gold standard for cross-browser web
development.