jQuery 3.0 and jQuery Compat 3.0 Alpha Versions Released

Posted on by

It’s been a long time since we did a major release, and you certainly deserve one. So we’re glad to announce the first alpha of jQuery 3.0!

Despite the 3.0 version number, we anticipate that these releases shouldn’t be too much trouble when it comes to upgrading existing code. Yes, there are a few breaking changes that justified the major version bump, but we’re hopeful these breakages don’t actually affect that many people. The jQuery Migrate plugin can help you to identify compatibility issues in your code as well. Your feedback on the changes in this alpha will help us greatly, so please try it out on your existing code and plugins!

There are actually two releases here. First is jQuery 3.0, which supports modern browsers and environments from IE9 forward. Second is jQuery Compat 3.0, which includes support for IE8. As an added bonus, both jQuery and jQuery Compat will include support for Yandex.Browser, a freeware browser released in 2012. You can get the files from the jQuery CDN, or link to them directly:

https://code.jquery.com/jquery-3.0.0-alpha1.js

https://code.jquery.com/jquery-compat-3.0.0-alpha1.js

You can also get the alpha versions from npm:

npm install jquery@3.0.0-alpha1

npm install jquery-compat@3.0.0-alpha1

 

Major changes

Below are just the highlights of the major new features, improvements, and bug fixes in these releases. A complete list of changes is available at the bottom of this post and on our GitHub issue tracker. On GitHub, you can additionally see the features we expect to put in later beta and final versions that have yet to land.

Simplified .show() and .hide() methods

Everyone’s mental model of jQuery’s .hide() method is that it sets display: none in CSS. Conversely, .show() clears the display so that the element shows again (assuming its parents are not hidden). Simple, right?

Well, no. There are actually many complex special cases that people asked us to “fix” over the years, which turned these methods into a convoluted confluence of principles. For example, what if the element is set to display: none in a stylesheet? jQuery would try to override that by forcing display: block on the element directly. Okay, but what if a normally block element like <li> was set to display: inline by a different stylesheet rule? How about the case where you call these methods on an element before it’s been added to the document and we don’t know what display value it will have? Determining all of that takes extra work. Sometimes it’s still just a guess that turns out to be wrong.

Since these methods add a style attribute to the element, they don’t tend to play well with techniques like responsive design where the visibility of elements may also be set by media queries. This leads to the need for jQuery handlers that listen for the orientationchange or resize events and manually hide or show parts of the page; it defeats the elegant solution that media queries were trying to implement.

You can see that jQuery was already about halfway down the path to total madness, and it didn’t make sense to complete the journey. The special cases and checks were not only complex and incomplete, but they caused significant performance issues on large pages.

So, instead, we’re experimentally defying the evolution of these methods and reverting to a simple, primordial model. This will break some code. If you have elements in a stylesheet that are set to display: none, the .show() method will no longer override that. So the most important rule for moving to jQuery 3.0 is this: Don’t use a stylesheet to set the default of display: none and then try to use .show() – or any method that shows elements, such as .slideDown() and .fadeIn() – to make it visible.

If you need an element to be hidden by default, the best way is to add a class name like “hidden” to the element and define that class to be display: none in a stylesheet. Then you can add or remove that class using jQuery’s .addClass() and .removeClass() methods to control visibility. Alternately, you can have a .ready() handler call .hide() on the elements before they are displayed on the page. Or, if you really must retain the stylesheet default, you can use .css("display", "block") (or the appropriate display value) to override the stylesheet.

We know that this is likely to be one of the most contentious and difficult changes in jQuery 3.0, so we wanted to put it out in this early release to see the effects. Please let us know how it affects your code and what you need to change in order to work with this new model.

https://github.com/jquery/jquery/issues/1767
https://github.com/jquery/jquery/issues/2057
https://github.com/jquery/jquery/issues/2308

Special case with .data() names

We have updated our .data() implementation to closer match the HTML5 dataset specification. All keys are now converted from kebab-case to camelCase, regardless of access method, and digits no longer participate in the conversion. For example, we will no longer differentiate between “foo-bar” and “fooBar”, but will differentiate between “foo-42” and “foo42”. These changes will mainly come into play when retrieving all data by calling .data() with no arguments, or when trying to access the data using a converted key (.data(“foo42”)) instead of the original (.data(“foo-42”)).

https://github.com/jquery/jquery/issues/1751

jQuery.Deferred is now Promises/A+ compatible

jQuery.Deferred objects have been updated for compatibility with Promises/A+ and ES2015 Promises, verified with the Promises/A+ Compliance Test Suite. This meant the introduction of a .catch() method and some major changes to the .then() method:

  • An exception thrown in a .then() callback now becomes a rejection value. Previously, exceptions bubbled all the way up, aborting callback execution and irreversibly locking both the parent and child Deferred objects.
  • The resolution state of a Deferred created by .then() is now controlled by its callbacks—exceptions become rejection values and non-thenable returns become fulfillment values. Previously, returns from rejection handlers became rejection values.
  • Callbacks are always invoked asynchronously. Previously, they would be called immediately upon binding or resolution, whichever came last.
  • Progress callbacks can no longer resolve Deferred objects to which they are bound.

Consider the following, in which a parent Deferred is rejected and a child callback generates an exception:

var parent = jQuery.Deferred();
var child = parent.then( null, function() {
  return "bar";
});
var callback = function( state ) {
  return function( value ) {
    console.log( state, value );
    throw new Error( "baz" );
  };
};
var grandchildren = [
  child.then( callback( "fulfilled" ), callback( "rejected" ) ),
  child.then( callback( "fulfilled" ), callback( "rejected" ) )
];
parent.reject( "foo" );
console.log( "parent resolved" );

As of jQuery 3.0, this will log “parent resolved” before invoking any callback, each child callback will then log “fulfilled bar”, and the grandchildren will be rejected with Error “baz”. In previous versions, this would log “rejected bar” (the child Deferred having been rejected instead of fulfilled) once and then immediately terminate with uncaught Error “baz” (“parent resolved” not being logged and the grandchildren remaining unresolved).

While caught exceptions had advantages for in-browser debugging, it is far more declarative (i.e. explicit) to handle them with rejection callbacks. Keep in mind that this places the responsibility on you to always add at least one rejection callback when working with promises. Otherwise, any errors will go unnoticed.

Legacy behavior can be recovered by replacing use of .then() with the now-deprecated .pipe() method (which has an identical signature).

jQuery.when has also been updated to accept any thenable object, which includes native Promise objects.

https://github.com/jquery/jquery/issues/1722
https://github.com/jquery/jquery/issues/2102

Removed special-case Deferred methods in jQuery.ajax

jqXHR object is a Promise, but also has extra methods like .abort() so that you can stop a request after it has been made.

As users increasingly embrace the Promise pattern for asynchronous work like AJAX, the idea of having special cases for the Promise returned by jQuery.ajax is an increasingly bad idea.

success, error, complete
done, fail, always

Note that this does not have any impact at all on the callbacks of the same name, which continue to exist and are not deprecated. This only affects the Promise methods!

https://github.com/jquery/jquery/issues/2084

Error cases don’t silently fail

Perhaps in a profound moment you’ve wondered, “What is the offset of a window?” Then you probably realized that is a crazy question – how can a window even have an offset?

In the past, jQuery has sometimes tried to make cases like this return something rather than having them throw errors. In this particular case of asking for the offset of a window, the answer up to now has been { top: 0, left: 0 } With this alpha of jQuery 3.0 we’re experimenting with the idea of having such cases throw errors so that crazy requests aren’t silently ignored. Please try the alpha and see if there is any code out there depending on jQuery to mask problems with invalid inputs.

https://github.com/jquery/jquery/issues/1784

.width(), .height(), .css(“width”), and .css(“height”) to return decimal values (whenever the browser does)

Previously, jQuery rounded values when retrieving width and height. Some browsers return subpixel values – such as IE and Firefox – and sometimes users need this precision when relying on these values for layout. We don’t expect this change to have a big impact on your code, but let us know if it does.

https://github.com/jquery/jquery/issues/1724

Removed deprecated event aliases

.load, .unload, and .error, deprecated since jQuery 1.8, are no more. Use .on() to register listeners.

https://github.com/jquery/jquery/issues/2286

jQuery.swap, jQuery.buildFragment, and jQuery.domManip are no longer accessible on the jQuery object

These methods were always intended for internal use only and were never documented. We are finally making them private to avoid confusion.

https://github.com/jquery/jquery/issues/2224
https://github.com/jquery/jquery/issues/2225

Animations now use requestAnimationFrame

On platforms that support the requestAnimationFrame API, which is pretty much everywhere but IE8 and IE9, jQuery will now use that API when performing animations. This should result in animations that are smoother and use less CPU time – and save battery as well on mobile devices.

jQuery tried using requestAnimationFrame a few years back but there were serious compatibility issues with existing code so we had to back it out. We think we’ve beaten most of those issues by suspending animations while a browser tab is out of view. Still, any code that depends on animations to always run in nearly real-time is making an unrealistic assumption.

.unwrap( selector )

Before jQuery 3.0, the .unwrap() method did not take any arguments. The selector parameter offers a way to be specific about which wrappers to remove.

https://github.com/jquery/jquery/issues/1744

Massive speedups for some jQuery custom selectors

Thanks to some detective work by Paul Irish at Google, we identified some cases where we could skip a bunch of extra work when custom selectors like :visible are used many times in the same document. That particular case is up to 17 times faster now!

Keep in mind that even with this improvement, selectors like :visible and :hidden can be expensive because they depend on the browser to determine whether elements are actually displaying on the page. That may require, in the worst case, a complete recalculation of CSS styles and page layout! While we don’t discourage their use in most cases, we recommend testing your pages to determine if these selectors are causing performance issues.

https://github.com/jquery/jquery/issues/2042

 

Thanks

Many thanks to all of you who participated in this release by testing, reporting bugs, or submitting patches, including Chris Antaki, Jason Bedard, Leonardo Braga, Bastian Buchholz, Anne-Gaelle Colom, David Corbacho, Brenard Cubacub, Hamish Dickson, Ben Edelman, Stephen Edgar, elas7, flexphperia, Corey Frang, Xue Fuqiao, Oleg Gaidarenko, Richard Gibson, Michał Gołębiowski, Scott González, goob, Veaceslav Grimalschi, Mu Haibao, Dan Hart, Frederic Hemberger, Nicolas Henry, Daniel Herman, Jon Hester, Victor Homyakov, Winston Howes, Daniel Husar, Essam Al Joubori, Veres Lajos, George Mauer, Richard McDaniel, Amit Merchant, Calvin Metcalf, Dave Methvin, MightyBranch, Nazar Mokrynskyi, Matthew Mueller, Martin Naumann, Alexander O’Mara, Randson Oliveira, Gilad Peleg, James Pearce, PJ, Senya Pugach, Aditya Raghavan, Chris Rebert, Aurelio De Rosa, Gabriel Schulhof, Mike Sidorov, Nick Stefan, Arthur Stolyar, Timo Tijhof, Ben Toews, Thomas Tortorini, Shivaji Varma, Arthur Verschaeve, Rick Waldron, Bin Xin, Imran M Yousuf, Jörn Zaefferer.

 

Changes

Here is the full list of changes since the last official releases (1.11.3 and 2.1.4):

 

Common to both jQuery and jQuery Compat

Ajax

  • Always use script injection in globalEval (#14757, bbdfbb4)
  • Remove jsonp callbacks through “jQuery#removeProp” method (#2323, a2ae215)
  • remove event dependency from the ajax module (4e7f34f)
  • Fix for request aborted in ajaxSend (#1775, 598ed05)
  • use anchor tag for parsing urls (#1875, b091fdb)
  • Fix cross-domain detection test for non-default port (83b038f)
  • $.post and $.get can now take an options object (#1986, 89ce0af)
  • simplify one ajax call and add explanatory comment (0ac28ed)
  • make jQuery#load “type” field explicit (4ef120d)
  • replace “jqXHR.complete” callback with “always” (97ef1f2)
  • remove deprecated extensions from ajax promise (#2084, 9d1b989)
  • remove use of jQuery#each second argument (a4715f4)
  • remove “onunload” event handler (a117dd0)
  • Remove remnants of the load event alias handling (38a6697)

Attributes

  • add SVG class manipulation (#2199, 20aaed3)
  • return null when attribute does not exist (#2118, aaeed53)
  • Use the option val hook in select val hook and simplify it (#1902, f6302b0)
  • remove unnecessary element null check (55ac56a)
  • fix failing test for new return value (5dc4616)
  • revert returning null for non-elements (7632b74)
  • revert returning null for non-existant attributes (2905961)

Build

  • update Sizzle to 2.0.0 (bcca4f0)
  • Update grunt-contrib-jshint (1556c46)
  • remove bower.json lint target (285cfbf)
  • add mailmap entry (3ec73ef)
  • Update the license attribute (#2331, 8e92e1e)
  • drop bower; use npm for front-end deps (#15186, e1949f4)
  • update front-end dependencies (8356948)
  • update node dependencies barring jscs (8e3a0ce)
  • update grunt-jscs-checker and pass with the new rules (c869a1e)
  • update requirejs dependency to 2.1.17 (#2290, a644101)
  • update source map options for the new grunt jshint (269a27c)
  • bower.json: remove moot `version` field (61e21a4)
  • fix broken assertions caused by QUnit update (8b6aeae)
  • Update commitplease dev dependency (39b7606)
  • remove deprecated JSHint options (34da7d5)
  • update AUTHORS.txt (8f13997)
  • Upgrade to commitplease 2.0.0 (5bc1ddc)
  • Update QUnit to latest (1.17.1) (2d5c5d2)
  • update version to 3.0.0-pre (7a607c5)
  • Move test to appropriate module (fbdbb6f)
  • Fix various typos (dc4b914)
  • Speed up the Travis build (31f4f8e)
  • Remove empty define({}) from build output (#1768, 2c1b556)
  • Remove npm from dependencies (b92acf7)
  • Upgrade to grunt-bowercopy 1.0.0 (323e82c)
  • Remove unused Sizzle test files (8d11310)
  • fix tests in AMD mode (6051609)
  • Move all external libraries to external directory (c5d9d88)
  • account for version labels in Sizzle versions (#1939, 78ac753)
  • update node dependencies (9101704)
  • Sizzle version labels must start with a dash (d6c97ab)
  • Don’t assume the browser environment; smoke test on Node w/ jsdom (#1950, 76df9e4)
  • Remove dates from copyright notice (66e1b6b)
  • Specify valid components for commit messages (0c9d018)
  • ignore test dependencies for npm install (35f8e15)
  • update Sizzle to 1.11.1 and include license (c0b23e2)
  • update Sizzle (#2042, #1969, 3a0dd5a)
  • update grunt-bowercopy (712e78c)
  • Update license (4f776e5)
  • Sanctify the component name status of Wrap (a4133ff)
  • Update native-promise-only (again) (f5aa89a)
  • Rearrange grunt/npm tasks into a build/dist/test pattern (bb928bd)
  • Update native-promise-only (0065e1f)
  • save sinon update for later (#2160, 98c25b7)

Callbacks

Core

  • Return empty array instead of null for parseHTML(“”) (#1997, 4116914)
  • use document.implemenation.createHTMLDocument in jQuery.parseHTML (58c2460)
  • Follow the AMD specification for define (892625b)
  • Throw an error on $(“#”) rather than returning 0-length collection (80022c8)
  • allow init to accept an alternate rootjQuery for migrate’s sake (#2101, 7a6931d)
  • remove unnecessary support test for createHTMLDocument (5923282)
  • pass empty string to createHTMLDocument to appease IE (31c7d7f)
  • revert addition of createHTMLDocument. Thanks, Safari 8. (b779831)
  • Update tested jsdom, drop obsolete workarounds (#2153, 06f6cd1)
  • re-introduce createHTMLDocument in parseHTML; Safari 8 left out (cfe468f)
  • Standardize indexOf comparisons (53aa87f)
  • remove custom ready event (#2264, c252c5f)
  • Consistently use local reference to access() (2fb719e)
  • Remove deprecated context and selector properties (#1908, 0ea8c32)
  • remove isArraylike check for nodes (#2238, 436f0ae)
  • add support to tag-hyphenated elements (534f130)
  • Use window.setTimeout & friends instead of global equivalents (#2177, 219c749)
  • Drop size and andSelf methods (#1749, f110360)
  • Drop strundefined variable (29838b6)
  • Make jQuery objects iterable (#1693, bb026fc)
  • add workaround for iOS JIT error in isArrayLike (#2145, 1541664)
  • Test all factory use cases from intro.js (#2181, ab40725)
  • Switch from modules to just window.setTimeout etc. (842958e)
  • Align branches: remove an unused variable, add comments (f6de5a9)
  • simplify “each” stylesheet iteration test (fcb6c4d)
  • Simplify and speed up .each (eeda11c)
  • organize prop & attr code to be similar (5153b53)
  • change jQuery.each and jQuery#each signatures (#2090, 2380028)

CSS

  • CSS:Event: simplification of native method signatures (85577a3)
  • Fix the “sanity check” test (995f707)
  • Remove non-functional unit test for negative margin (4ab7431)
  • Add an integration test for issue gh-1764 (8887106)
  • Remove use of getDefaultComputedStyle (#15227, 274feb5)
  • Use pre-defined displays for html and body (a772418)
  • Correct typo in the comment (7e09619)
  • Removed redundant “to the number” in comment (895ea68)
  • fix :visible/:hidden selectors for inline element w/ content (#2227, 79bcb29)
  • Support relative adjustment in any applicable unit (#1711, 9b03f6d)
  • elements are hidden when either offsetWidth or offsetHeight is zero (#10406, #13132, 10399dd)
  • Ignore the CSS cascade in show()/hide()/etc. (#1767, #2071, 86419b1)
  • Fix the pixelMarginRight support test in Android 2.3 (cdfc2d0)
  • Clean up memory leak in reliableMarginRight (#1795, 7d15b4d)
  • Don’t cache unrecognized CSS property names (#2015, d471842)
  • Don’t name the anonymous swap function (0019a46)
  • make the getStyles function more readable (3a0d582)
  • Work around an IE11 fullscreen dimensions bug (#1764, 90d828b)
  • Add unit tests for negative margins and positioning (1b932bb)
  • simplify “defaultDisplay” module (c62486f)
  • Make .css(“width”) & .css(“height”) return fractional values (#1724, b60b26e)
  • Don’t expose jQuery.swap (#2058, bb4d888)
  • Improve a comment explaining IE11 fullscreen bug (8e4aac8)

Data

  • do not include digits when camelCasing (#1751, 2862a07)
  • always camelCase keys in .data() (#2257, 0e79098)
  • Use a PDF object instead of a Java applet for acceptData testing (#1938, 087d280)
  • camelCasing should not ignore case (#2070, 172cad8)

Deferred

Dimensions

  • allow modification of coordinates argument (#1848, f7e60dc)

Docs

  • 1.x-master branch -> compat branch; 2.x branch -> master branch (758fd6c)
  • correct grunt command in README.md (#1850, 9d6beac)
  • remove redundant instruction from the readme (#2359, 3c92770)
  • Clarify custom build instructions (a3779bc)

Effects

  • Adding unit tests for jQuery.Animation (b3b2d6c)
  • Reintroduce use of requestAnimationFrame (#15147, 72119e0)
  • add tests for jQuery.easing._default in Animation and Tween (6d7ef56)
  • set default easing using jQuery.easing._default (#2219, 5f2ea40)
  • Add tests for jQuery.Tween (cdaed15)
  • Improve raf logic (708764f)

Events

  • remove preDispatch hook & simplify “simulate” signature (3655c4e)
  • remove guard for falsy handler argument of jQuery#on method (fac67a9)
  • add support comment (9db9316)
  • correct support comment (361a0d5)
  • HTML5 drop events inherit from MouseEvent (#2009, d7e5fce)
  • Fully clean up events in unit test (4467ed6)
  • Empty namespaces should be uneventfully ignored (8653068)
  • remove outdated originalEvent hack (6df669f)
  • Remove fake originalEvent from jQuery.Event.simulate (#2300, 7475d5d)
  • fix incorrect window bug with scrollTop/Left in iframes (#1945, d21edb5)
  • remove deprecated event aliases (#2286, 0705be4)
  • Add a note about a mouseenter bug in Chrome (a5e1c9b)
  • Restore the `constructor` property on jQuery.Event prototype (#15090, b807aed)
  • Copy detail property to jQuery.Event on native events (#1867, d9ed166)
  • Remove an internal argument to the on method (04a2969)
  • Normalize mouse event properties in drag events (#1925, 97cf528)
  • provide verbose comment for focus(in | out) & rename support prop (c074006)
  • remove redundant guards for the event methods (#2047, a873558)

Manipulation

Misc

  • Drop support for older browsers; update support comments (740e190)
  • Need for speed removed by 9ad6e7e (ff928f5)
  • Mac OS is now OS X, thanks @xfq (d30c482)

Offset

  • remove ownerDocument check in offset getter (#2115, 6176567)
  • Round offset value for the sake of floating errors (#2147, 62ae2d0)
  • return zeros for disconnected/hidden elements (#2310, 40dcc76)
  • Fix .offset() to correctly work with ShadowDOM (#1784, 1617479)
  • account for scroll when calculating position (#1708, 2d71594)
  • don’t run scrollTop/scrollLeft iframe test in Android 2.3 & 4.0 (#1981, 0c46643)
  • return before getBoundingClientRect to avoid error in IE8-11 (0e4477c)
  • add tests for hidden elements + scroll (b041242)
  • simplify jQuery#offsetParent method (74ae544)

README

  • Fix punctuation in tile (df62159)
  • Fix minor style issues. Thanks @MightyBranch! (edfc94d)
  • update the Homebrew site address (b410b15)
  • various text fixes (31b63fc)
  • Update the description of the deprecated module (1d75273)
  • Improve build instructions (2e9c1ea)

Release

  • update AUTHORS.txt (e905dcd)
  • Remove copying of jquery-latest files (c34ed46)
  • properly set the dist remote when it’s a real release (c44dd77)
  • bower.json is actually generated from scratch (61224f5)
  • Distribute files to distribution repo (#1869, #1673, #2045, 26eca14)
  • dist can be run during a test (aae998b)
  • push dist to same remote as project (1ba45fc)
  • remove sourcemap comment from all copies of minified file (#1707, a76c781)
  • fix CDN archive creation (#1940, e0673df)

Selector/Sizzle

  • add jQuery.uniqueSort; deprecate jQuery.unique (#2228, e1090c3)
  • add test for jQuery.unique() alias (add85af)
  • Remove “#” exception for identifier tokens (86e62d8)
  • update to 2.1.1 (7602dc7)

Support

  • Re-organize browser order, add Safari 8 (43faf6d)
  • Correct iOS 8 support test results, re-arrange entries (ce308e2)

Tests

  • Update QUnit (6748ba3)
  • Minor updates for QUnit 1.16 compatibility (26276a3)
  • Accommodate page changes from the QUnit HTML reporter (3c13f4c)
  • Increase QUnit timeout (ff18d8e)
  • Tilt at a few style guide windmills (906caeb)
  • Correct a typo in the regex matching Safari 8 (c17543f)
  • Add Microsoft Edge results (from Windows 10 build 10130) (8e111df)
  • Remove Edge version from the user agent (5a1217e)
  • Remove test/data/ua.txt (#2398, e831856)
  • fix tests in accordance with new :visible behavior (16713fb)
  • add the current version of node and iojs to the travis config (bd9a138)
  • Expand CSS relative adjustment tolerance for IE (e22ef5d)
  • Fix CSS relative adjustment test for round-down browsers (48be675)
  • Lower the checks rounding error (a44cfa0)
  • make top of the HTML suite compliant with style guide (8356281)

Wrap

  • Support .unwrap( selector) for selective unwrapping (#1744, 7b09235)

 

jQuery 3.0 Only

Ajax

  • Remove workaround for IE6/7 (e519098)
  • simplify jQuery.parseXML method (5a0867d)

Build

  • use different versions of jsdom for Node and iojs testing (#2266, 5c3101f)
  • Refactor Node smoke tests (9c8a3ec)
  • Moved JSHint directives to .jshintrc file (15a609f)

CSS

  • save 20 bytes in css/support (45ec73f)
  • Collapse a double if statement into one (7855a1a)
  • Restore the hack to get pixels for .css(‘width’) etc. (3747cc6)

Data

  • shave off a couple of bytes (6f65f5f)
  • avoid Object.defineProperties for nodes (#1728, 95fb798)
  • avoid non-alphanumeric chars in expando properties (0cdec79)
  • updates to element[expando] cache (222ac3a)
  • move element cache to element[expando] (#1734, d702b76)
  • remove some unused code (764dc94)
  • remove the expando when there’s no more data (#1760, 56bb677)
  • speed up $.fn.data() for camel-cased key (#1941, 72c4a06)
  • restore explicit data removal of private data in cleanData. (#2127, 332fd94)
  • Drop the tests relying on applets (#1938, 95c0a10)

Docs

  • Add info about Sizzle not being excludable on the compat branch (#2184, 062b526)
  • Fix README uppercase (b50e0f2)

Manipulation

  • Tolerate XMLNode host object input to getAll (#15151, 1ae025e)
  • Check state lost if the name is set for Android 4.0-4.3 (1bbb678)

Misc

  • Adjust comments & docs to dropping IE * Misc: Update all references to bugs.jquery.com (#1681, 3e89a53)
  • Remove leftover -moz-box-sizing in tests (e81b258)

Offset

  • Simplified a conditional (4287442)
  • don’t run scrollTop/scrollLeft iframe test in mobile Safari (4ab8603)

README

  • Add selector-native.js link. Thanks @randsonjs! (cfe2eae)

Tests

  • Remove a trailing comma for compatibility with the compat branch (dc8ba6a)

 

jQuery Compat 3.0 only

Ajax

  • Add support comment and fix code style issue (e38a94a)
  • Run the PATCH test only in IE8 on TestSwarm (#1994, 2524da0)
  • move explanatory comment to appropriate place (04fc801)
  • Use the native XHR for all non-local requests in IE9+ (#1684, 61f812b)
  • Rename Spartan to Edge in a comment (8d88cd5)
  • Fix the XHR fallback logic for IE8 (bd699cb)

Attributes

  • Use typeof check for getAttribute method (075da30)
  • don’t test SVG CSS-class manipulation in IE8 (57fb2dc)
  • fix IE8 issues (f2bcf87)

Build

  • Point to files from the compat branch, not master (b7663ea)
  • Put “jQuery Compat” in banners in built files (8cd6875)
  • 1.x-master -> compat (2912ddd)
  • Add “timers_ie.js” file back to the repo (31e6697)
  • append “+compat” to tag version and jQuery.fn.jquery (#2269, d18b645)
  • Correct indentation issue (d0f27a7)

Callbacks

  • Change broken url to wayback one (e4cbc97)

Core

  • Align code in intro.js with master (fe2a584)

CSS

  • Add a support test for the hack for .css(‘marginRight’) etc. (25bc680)
  • Fix get upper case alpha opacity in IE8 (#1705, c5e8e12)
  • simplify hack of css getter for the computed values (dac716c)
  • fix dependency order for amd (e185aa3)

Data

  • use removeAttribute in cleanData to bypass Chrome bug (#1664, 9d1d90e)

Deferred

  • pass lint in new catch tests (203979d)

Docs

Effects

Events

  • Add reference to data module (2866da9)
  • correct an unfinished comment (ac23f91)

Manipulation

  • don’t test data-URI with script element in IE8 (503e545)
  • Plug an IE8 memory leak in noCloneEvent feature detect (#1840, faf295a)
  • Update html5shiv elements (#15241, a953389)
  • blacklist IE8 from running tests for tag-hyphenated elems (87bb713)

Misc

Offset

  • allow offset setter to throw for disconnected elements (#2114, dc49f62)
  • getBounding doesn’t return width/height in IE8. Fixes test. (3b1de11)
  • fix iframe scrollTop/Left test for IE8 (d632699)
  • fix iframe scrollTop/Left test for IE8 and iPhone (62a333e)
  • revert to jQuery.contains for IE8’s sake (compat only) (6df3990)
  • no need to check for ownerDocument (523de77)

Tests

  • Restore IE8 workarounds (Sinon timers for IE & HTML5 shiv) (0b07c65)

Traversing

  • simplify jQuery#contents method (7230df1)

jQuery 1.11.3 and 2.1.4 Released – iOS Fail-Safe Edition

Posted on by

Here we are again. It’s too late for April Fools, so you can believe us when we tell you that we have two new patch releases for you: jQuery 1.11.3 and 2.1.4.

These releases include a hot-fix for a rare bug in iOS 8.2 and 8.3. This is the only change. As with 1.11.2 and 2.1.3, we do not anticipate any issues when upgrading. However, if you do encounter bugs in upgrading from the previous versions, please let us know.

You can include these files directly from the jQuery CDN if you like, or copy them to your own local server. The 1.x branch includes support for IE 6/7/8 and the 2.x branch does not.

https://code.jquery.com/jquery-1.11.3.js

https://code.jquery.com/jquery-2.1.4.js

These updates are already available as the current versions on npm and Bower. Information on all the ways to get jQuery is available at https://jquery.com/download/. Please keep in mind that public, third-party CDNs receive their copies today and it can take a few days to post the files. If you’re anxious to get started, our CDN is always available.

Many thanks to all of you who participated in this release by testing, reporting bugs, or submitting patches, including John-David Dalton, Michał Gołębiowski, Oleg Gaidarenko, Richard Gibson, Dave Methvin, Benjamin Poulain, and Oz Solomon.

Thanks for all your support, and we look forward to showing you all we have in store for jQuery 3.0!

 

jQuery 1.11.2 and 2.1.3 Released – Safari Fail-Safe Edition

Posted on by

Season’s greetings! After a thoughtful review of the Naughty and Nice lists, we have decided to leave a small present under the tree to finish 2014: jQuery 1.11.2 and 2.1.3! These releases include several bug fixes to make your cross-browser development experience better.

The most significant fix in this release is a workaround for a serious querySelector bug in Safari 8.0 and 7.1. When this bug popped up we were hopeful that it would be fixed in patch releases but that did not happen. Apple is by far the least transparent browser maker, and we have very little information about when the Webkit patch for this bug might be pulled into Safari. As a result, we have decided to patch this in Sizzle, the selector engine used by jQuery.

A bug like this one emphasizes the benefit of using a library like jQuery rather than going directly to the DOM APIs. Even modern browsers can suffer from bugs that aren’t fixed for a long time, and there are still cross-browser feature differences with several browsers in wide use such as Android 2.3. Special-case code for obscure browser issues can seem unnecessary until you spend a day trying to debug a problem in your own code caused by one. Or worse, lose a paying customer because they couldn’t use your site from their old phone.

Another bug that makes it difficult for us to test jQuery on iOS 8 is that the user agent of the simulator is incorrect so the iOS 8 simulator is not recognized by our unit test infrastructure. The fix for that issue is very simple but Apple won’t tell us if we can count on it being done. For now we’re doing our iOS 8 testing manually.

In addition, this release includes several changes inside jQuery to avoid holding onto DOM elements unnecessarily. Although the old code generally wouldn’t cause things to run incorrectly, web pages might run slowly and use more memory than necessary.

You may notice that we skipped a patch release number in the 2.x branch. We didn’t actually skip it, we built it and found a problem that caused problems when jQuery was used with node. (Many thanks to Denis Sokolov for letting us know immediately and prodding us to fix it!) Rather than shipping those files to the other CDNs, we decided to create new releases.

As far as the potential for compatibility or regression issues, we believe this is a very low-risk upgrade for anyone currently using 1.11.1 or 2.1.1. We are making this release ahead of jQuery 3.0 to ensure that you can use a Safari-safe version of jQuery without the need to review your code for compatibility with changes being anticipated in jQuery 3.0. If you do encounter bugs, in upgrading from the previous version, please let us know.

You can include these files directly from the jQuery CDN if you like, or copy them to your own local server. The 1.x branch includes support for IE 6/7/8 and the 2.x branch does not.

https://code.jquery.com/jquery-1.11.2.js

https://code.jquery.com/jquery-2.1.3.js

These updates are already available as the current versions on npm and Bower. Information on all the ways to get jQuery is available at https://jquery.com/download/. Public CDNs receive their copies today, please give them a few days to post the files and don’t be impatient. If you’re anxious to get a quick start, just use the files on our CDN until they have a chance to update.

Many thanks to all of you who participated in this release by testing, reporting bugs, or submitting patches, including Chris Antaki, Denis Sokolov, Jason Bedard, Julian Aubourg, Liang Peng, Michał Gołębiowski, Oleg Gaidarenko, PashaG, Richard Gibson, Rodrigo Rosenfeld Rosas, Timmy Willison, and TJ VanToll.

Since the last release of jQuery we have moved from a Trac installation to GitHub issues, so there are currently tickets for this release in both bug trackers. References to the Trac tickets have been migrated to GitHub issues, however, so you can use this GitHub Issues query to review all the tickets.

Thanks for all your support, and see you at jQuery 3.0!

jQuery 3.0: The Next Generations

Posted on by

It’s hard to believe it’s been nearly eight years since jQuery was released. Web development has changed a lot over the years, and jQuery has changed along with it. Through all of this time, the team has tried to walk the line between maintaining compatibility with code from the past versus supporting the best web development practices of the present.

One of those best practices is semantic versioning, or semver for short. In a practical sense, semver gives developers (and build tools) an idea of the risk involved in moving to a new version of software. Version numbers are in the form of MAJOR.MINOR.PATCH with each of the three components being an integer. In semver, if the MAJOR number changes it indicates there are breaking changes in the API and thus developers need to beware.

The concept of versioning gets a little more nuanced with jQuery, where browser compatibility can be just as important as API compatibility. In order to create a slimmer jQuery, the team started shipping two versions in 2013. The first version remained numbered in the 1.x line and, currently at 1.11.1, maintains compatibility with a maximal number of browsers. The second version, starting with 2.0.0 and now at 2.1.1, dropped support for browsers like IE8 or lower in order to streamline the code. Both the 1.x and 2.x versions of jQuery have the same public APIs, even though they differ somewhat in their internal implementations.

Our next releases will use a different nomenclature. As before, there will be two different released files. The successor to what is now version 1.11.1 will become jQuery Compat 3.0. The successor to jQuery 2.1.1 will be jQuery 3.0. There are two different packages on npm and Bower, but they share the same version to indicate they have the same API behavior.

We’ll also be re-aligning our policy for browser support starting with these releases. The main jQuery package remains small and tight by supporting the evergreen browsers (the current and previous versions of a specific browser) that are common at the time of its release. We may support additional browsers in this package based on market share. The jQuery Compat package offers much wider browser support, but at the expense of a larger file size and potentially lower performance.

Despite the big version number jump, we don’t anticipate a lot of migration issues for most current jQuery code. We’re just being good semver citizens with this version bump. Changes such as removing deprecated methods will be detected by a new version of the jQuery Migrate plugin to make them easy to find and fix. We’ll have more details on the changes in future blog posts.

So, here’s the TL;DR for version 3.0 of the jQuery API:

  • If you need support for the widest variety of browsers including IE8, Opera 12, Safari 5, and the like, use the jQuery-Compat 3.0.0 package. We recommend this version for most web sites, since it provides the best compatibility for all website visitors.
  • If your web site is built only for evergreen leading-edge browsers, or is an HTML-based app contained in a webview (for example PhoneGap or Cordova) where you know which browser engines are in use, go for the jQuery 3.0.0 package.
  • Until we announce otherwise, both packages will contain the same public APIs in correspondingly-numbered major and minor versions. This should make it easy for developers to switch between the two and be maximally compatible with third-party jQuery plugins.

With each future release, we’ll be making both packages available on npm and bower. Both packages will also be available as single-file builds on the jQuery CDN. Using them from there is as simple as including either jquery-compat-3.0.0.js or jquery-3.0.0.js depending on your needs. We’ve talked with the folks who run Google’s CDN and they will also be supporting both packages.

As we make further progress on version 3.0, we will update everyone with the details about code changes, supported browsers, and the like. Stay tuned!

Volunteers Wanted: Trac Enhancements

Posted on by

The jQuery and jQuery UI teams use Trac to do their bug reporting and tracking. The jQuery Core bug tracker could really use a Trac expert to migrate us to Trac 1.0 and fix a few nagging issues we’ve been having. If you’re an expert Trac-meister, or just someone with good Trac setup/configuration experience who’s up to the challenge, we’d love to talk with you! Send a message to dave(at)jquery.com and we’ll be in touch.

Since some of you will inevitably ask: GitHub’s integration between issues and commits is wonderful, but it’s not anywhere near as powerful as Trac when it comes to searching and reporting. In addition, our projects have more than seven years of history comprising thousands of bug reports with important data in them. That’s a non-trivial amount of data to import into GitHub issues and groom to be useful once it’s imported. We feel that staying with Trac is the lowest-effort way for us to give us the bug tracking abilities we need.

Don’t Use jquery-latest.js

Posted on by

Earlier this week the jQuery CDN had an issue that made the jquery-latest.js and jquery-latest.min.js files unavailable for a few hours in some geographical areas. (This wasn’t a problem with the CDN itself, but with the repository that provides files for the CDN.) While we always hope to have 100% uptime, this particular outage emphasized the number of production sites following the antipattern of using this file. So let’s be clear: Don’t use jquery-latest.js on a production site.

We know that jquery-latest.js is abused because of the CDN statistics showing it’s the most popular file. That wouldn’t be the case if it was only being used by developers to make a local copy. The jquery-latest.js and jquery-latest.min.js files were meant to provide a simple way to download the latest released version of jQuery core. Instead, some developers include this version directly in their production sites, exposing users to the risk of a broken site each time a new version of jQuery is released. The team tries to minimize those risks, of course, but the jQuery ecosystem is so large that we can’t possibly check it all before making a new release.

To mitigate the risk of “breaking the web”, the jQuery team decided back in 2013 that jquery-latest.js could not be upgraded to the 2.0 branch even though that is technically the latest version. There would just be too many sites that would mysteriously stop working with older versions of Internet Explorer, and many of those sites may not be maintained today.

As jQuery adoption has continued to grow, even that safeguard seems insufficient to protect against careless use of http://code.jquery.com/jquery-latest.js. So we have decided to stop updating this file, as well as the minified copy, keeping both files at version 1.11.1 forever. The latest released version is always available through either the jQuery core download page or the CDN home page. Developers can download the latest version from one of those pages or reference it in a script tag directly from the jQuery CDN by version number.

The Google CDN team has joined us in this effort to prevent inadvertent web breakage and no longer updates the file at http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js. That file will stay locked at version 1.11.1 as well. However, note that this file currently has a very short cache time, which means you’re losing the performance benefit of of a long cache time that the CDN provides when you request a full version like 1.11.1 instead.

So please spread the word! If you see a site directly using the jQuery CDN’s jquery-latest.js or the Google CDN equivalent in their script tags, let them know they should change to a specific version. If you need the latest version, get it from the download page or our CDN page. For both the jQuery and Google CDNs, always provide a full version number when referencing files in a <script> tag. Thanks!

jQuery 1.11.1 and 2.1.1 Released

Posted on by

Ah, the air is sweet with the scent of spring and new jQuery 1.11.1 and 2.1.1 are in bloom. These are minor patch releases and shouldn’t pose any major compatibility issues. Throw a Cinco de Mayo party and have your friends come over to test. If you dig up a problem, let us know at bugs.jquery.com, and be sure to provide a simple test case using jsfiddle.net or jsbin.com to demonstrate the problem.

You can include these files directly from the jQuery CDN if you like, or copy them to your own local server. The 1.x branch includes support for IE 6/7/8 and the 2.x branch does not.

http://code.jquery.com/jquery-1.11.1.js
http://code.jquery.com/jquery-2.1.1.js

The Google and Microsoft CDNs will be getting their copies today just like you did, so please give them a few days to post the files and don’t be impatient. If you’re anxious to get a quick start, just use the files on our CDN until they have a chance to post.

Minified files (for production use) and map files (for debugging) are also available. If you want to use the map file for debugging the minified code, copy the minified file and add a //# sourceMappingURL comment to the end of the file.
http://code.jquery.com/jquery-1.11.1.min.js
http://code.jquery.com/jquery-1.11.1.min.map
http://code.jquery.com/jquery-2.1.1.min.js
http://code.jquery.com/jquery-2.1.1.min.map

Many thanks to all of you who participated in this release by testing, reporting bugs, or submitting patches, including Benjy Cui, Christian Kosmowski, Jason Frank, Julian Aubourg, Jens Simon, John Hoven, John Madhavan-Reese, Jonathan Sampson, Jörn Zaefferer, Leo Balter, Louis-Rémi Babé, Michał Gołębiowski, Oleg Gaidarenko, Philip Jägenstedt, R.G. Otten, Rhys Evans, Richard Gibson, Rick Waldron, Rob Graeber, Rodrigo Rosas, Roman Reiß, S. Andrew Sheppard, Scott González, and Timmy Willison.

Here are the changes since the last official releases (1.11.0 and 2.1.0):

Common to jQuery 1.11.1 and 2.1.1

Ajax

Attributes

Build

Core

Css

Data

Dimensions

Effects

Event

Misc

jQuery 2.1.1

Ajax

Attributes

Core

Css

Event

Manipulation

Selector

Support

jQuery 1.11.1

Css

jQuery 1.11.1 RC2 and 2.1.1 RC2 Released

Posted on by

Spring has sprung, and these release candidates for jQuery 1.11.1 and 2.1.1 are in full bloom. You know what that means? It’s time to get serious about testing! We really want our next release to be solid and reliable, and to do that we need your help. Please try out these files in your projects and pages, just a quick test would be appreciated. If you unearth any problems, let us know at bugs.jquery.com.

The beta files are located on the jQuery CDN, you can include them directly from the CDN if you like (but don’t use them in production!). As always, the 1.x branch includes support for IE 6/7/8 and the 2.x branch does not:

http://code.jquery.com/jquery-1.11.1-rc2.js
http://code.jquery.com/jquery-2.1.1-rc2.js

Here are the bugs fixed since the last official release (1.11.0 and 2.1.0):

Common to jQuery 1.11.1 RC2 and 2.1.1 RC2

Ajax

Attributes

Build

Core

Css

Dimensions

Event

Misc

jQuery 1.11.1 RC2

Css

jQuery 2.1.1 RC2

Ajax

Attributes

Core

Css

Event

Manipulation

Selector

Browser Support in jQuery 1.12 and Beyond

Posted on by

With Microsoft ending Windows XP support this month, we’re giving the jQuery community some long-lead-time notice on changes to browser support.

First of all, don’t panic! Nothing is really changing with respect to the browsers that can run jQuery for at least six more months. Our goal is to let everyone in the web development community know what the jQuery team intends to do over the next year, so that you can plan accordingly.

What’s Changing?

There are no firm dates, but we plan on releasing jQuery core versions 1.12 and 2.2 this year. jQuery 1.13/2.3 will be released some time in 2015.

jQuery 1.12: This will be the last release to support Internet Explorer 6 and 7. As of today, no feature requests or bug fixes will be landed for them. Only serious regressions for these browsers will be fixed in patch releases (e.g., 1.12.1). jQuery 1.13 will support IE8 as its minimum browser.

Both jQuery 1.12 and 2.2: These will be the last releases to support Opera 12.1x and Safari 5.1. As of today, no feature requests or bug fixes will be landed for them. Only serious regressions for these browsers will be fixed in patch releases (e.g., 1.12.1 or 2.2.1).

Both jQuery 1.13 and 2.3: We will remove patches and workarounds that are specific to API conformance for the browsers we no longer support, in order to simplify the code base.

What you need to do: If your projects use a package manager that pulls in the latest release of jQuery, keep in mind that the 1.12-to-1.13 or 2.2-to-2.3 upgrade will reduce browser coverage. You may want to stay on 1.12 or lower if support for older browsers is required. See the instructions of your package manager for details on how to do that.

The Meaning of “Support”

Defining what “support” means is trickier than you might think. Under the premise that “untested code is broken code,” the jQuery core team prefers to say we fully support a browser if the project regularly runs unit tests against that browser. The unit tests ensure that every API returns a consistent set of results in all browsers.

Even when we support a browser, there can be bugs we can’t reasonably fix. For example, Internet Explorer 6 through 11 fire focus and blur events asynchronously and the code required to make them appear synchronous would be significant. Safari on iOS doesn’t support the onbeforeunload event which is pretty much impossible to shim. Until last month, Firefox didn’t respect overflow: hidden on a fieldset element. We try to work with browser vendors to get these bugs fixed.

On browsers that we don’t officially support, we still work hard to eliminate “killer bugs” such as script errors during initialization that make the page totally unusable. If you want to see the lengths to which we go to deal with obscure problems, look at this browser-crashing Android 2.3 bug on Japanese phones which was extremely intermittent and hard to diagnose. With the help of several users we were able to track down and work around the problem.

It comes down to this: We can only ensure high-quality continuing support for the browsers and environments we constantly unit-test. However, we will try to provide some reasonable level of support to browsers in any popular environment. The highest priority will be on ensuring the browser doesn’t throw errors. Low priority will be put on ensuring that old or rare browsers produce the exact same API results as modern browsers.

Who Uses Old Browsers Now?

When looking at browser stats, don’t look at where they are today. Think about where they will be in 2015. All told, we think all these browsers will be in the small single digits of market share by then. If numbers from StatCounter can be believed, these browsers are already there and will be even less prevalent when jQuery finally drops support.

Ultimately these whole-Internet stats don’t matter though. What really matters is whether the visitors to your site or users of your web application are running a particular browser. That is something that only you can answer. The decision to upgrade to a new jQuery version is always in your hands as a developer.

The Myth of Browser Consistency

Today and long into the future, jQuery will still contain dozens of browser-specific fixes to normalize behavior. At this point, the most problematic and troublesome browser for jQuery 2.x is the one in Android 2.3. That version is still a significant 20 percent of the Android installed base, and still being shipped in new mobile products. Several JavaScript features like element.classList are not supported there, and it’s one of the last browsers to still require -webkit-prefixing for standardized CSS properties.

jQuery projects are all about making your development life easier, so we’ll continue to support the fixes that are needed to smooth out inconsistencies on popular browsers. As the market share of specific browsers dwindles to zero, we’ll take the opportunity to remove their patches and de-support them in order to streamline our code bases. That makes all jQuery pages a little bit faster.

jQuery 1.11.1 Beta 1 and 2.1.1 Beta 1 Released

Posted on by

It’s been a couple of months since our last releases escaped the grip of endless winter, so we thought it would be good to thaw out a beta that collects up the bugs that have been reported and fixed recently. Most of these bugs are mild as severity and frequency go, but that’s easier to say if you’re not impacted!

As with all our beta releases, we make them available so you can test against them and let us know if they fix the bugs without introducing new bugs, surprising behaviors, or regressions. Please help us out by dropping these files into your projects and pages for a quick spin. If you discover any undesirable changes, let us know at bugs.jquery.com.

The beta files are located on the jQuery CDN, you can include them directly from the CDN if you like (but don’t use them in production!). As always, the 1.x branch includes support for IE 6/7/8 and the 2.x branch does not:

http://code.jquery.com/jquery-1.11.1-beta1.js
http://code.jquery.com/jquery-2.1.1-beta1.js

Here are the bugs addressed by these releases:

Common to 1.11.1/2.1.1 Beta 1

Ajax

Attributes

Build

Core

Css

Event

Unfiled

jQuery 1.11.1 Beta 1

Css

jQuery 2.1.1 Beta 1

Ajax

Attributes

Core

Css

Event

Manipulation

Selector

Support