The State of jQuery 2013

Posted on by

My fellow web developers, the state of jQuery is strong.

On January 14, 2006, John Resig attended BarCampNYC and made a presentation about his new project called jQuery. In a contemporary blog post John said, “This code revolutionizes the way you can get JavaScript to interact with HTML.” It was a bold statement, but in retrospect we know it was an understatement.

Seven years after John introduced jQuery to the world, the JavaScript library he created has continued to evolve. Today, jQuery is used by more than half of the top 100,000 sites and is the most popular JavaScript library by far.

Last year, jQuery projects moved from under the wing of the Software Freedom Conservancy to our own non-profit organization: The jQuery Foundation. This new Foundation was created not just to foster jQuery code projects, but to advocate for the needs of web developers everywhere. We’re starting to see the fruits of that labor.

To serve the evolving needs of web developers, jQuery has grown far beyond the core library. jQuery UI provides a rich set of user interface widgets that share a consistent and common set of events, programming conventions, and visual styles. jQuery Mobile offers a framework designed to simplify web site and HTML app development on mobile devices. Additional jQuery Foundation projects such as Sizzle, QUnit, and TestSwarm provide valuable components and tools for web development.

Anniversary Announcements

During the coming two weeks you’ll hear more about each of these jQuery Foundation initiatives:

jQuery 1.9 final: This latest version of jQuery core provides support for a full spectrum of browsers, from IE6 all the way to the most recent releases of every major browser.

jQuery 2.0 beta: Here is your taste of the future, a jQuery that can be faster and smaller without the need to support IE 6, 7, or 8. It’s a great choice for platform-specific HTML applications.

jQuery Migrate 1.0 final: Use this plugin to find things that may cause upgrade issues when you move up from older jQuery versions, and to allow older code to work with either jQuery 1.9 or 2.0.

jQuery UI 1.10 final: This version of jQuery UI includes API redesigns for both the Dialog and Progressbar components, in addition to a healthy set of fixes to other components.

New and remodeled web sites: All jQuery sites are being updated with a new look, and we’re encouraging contributions via Github. The most exciting news of all? The Plugin site returns!

Conferences: Our next conference is being held in Portland Oregon on June 12-14, so save the date! Ticket sales and a call for speakers will open on January 25th at noon Eastern time. Details of future conferences are coming soon; they include Austin Texas in September 2013, San Diego California in February 2014, and Chicago Illinois in July 2014.

Membership: Our new program lets you or your company show support by donating to the jQuery Foundation; you’ll get benefits such as t-shirts, hoodies, and discounts on conference tickets.

jQuery’s Mission

With the impending arrival of jQuery 2.0 some people have been asking, “If jQuery doesn’t have to worry about IE 6, 7 or 8 anymore, where does it go now? Aren’t cross-browser issues the whole reason for jQuery’s existence?”

First of all, let’s be very clear: The jQuery team does “worry about” IE 6/7/8, with jQuery 1.9. We’ve created a legacy-free jQuery 2.0 in order to address the many situations where older versions of IE aren’t needed. Some glorious day in the future, jQuery 2.0 will be the only version you’ll need; until then we’ll continue to maintain jQuery 1.9.

Second, jQuery wasn’t just created to iron out browser differences. It introduced a concise, powerful, and expressive API for managing HTML documents that is far better than the original W3C DOM APIs. Using the jQuery API, developers have created reusable jQuery plugins that make the process of building a web site or HTML application much easier. jQuery is a great choice even for an iPhone HTML app that will never see a different web platform.

But to the point about cross-browser issues, it’s a complete myth that today’s modern browsers have no differences. Look through the jQuery source code and you’ll see plenty of places where it has to fix, patch, and mask issues in modern browsers; those problems didn’t end with IE8. jQuery 2.0 now has more patches and shims for Chrome, Safari, and Firefox than for Internet Explorer!

In fixing and patching these differences, we often act as an advocate for web developers to the browser makers and standards organizations. We want jQuery APIs to be consistent and return useful results, even when browser bugs or ill-conceived standards dictate otherwise. It’s not always easy to do that.

Sometimes, doing the right thing requires changes to the standards, or new standards altogether. For some examples of that, see the work Mike Sherov has done to fix getComputedStyle(), or the efforts of Mat Marquis and others to create a responsive image tag. Team members Yehuda Katz and Rick Waldron are participating in the W3C and ECMA standards groups that define the technologies we all use.

Let’s Work Together

All of these benefits to the web development community are delivered by a dedicated group of jQuery team members. We’re proud to have developers like these working on behalf of the jQuery Foundation to advocate for the needs of the community. The majority of the team volunteers their time, or has their time subsidized through the generous donation of their employer. But there is always more work to do than the team can possibly tackle. Here are ways you can help:

Join the jQuery Foundation. As a member, you’ll get an awesome annual membership gift such as a t-shirt, hoodie, or bag, depending on your level of contribution. Your cash donations can help to keep our operations going. We’ll be announcing a memebership program in a few days as part of our anniversary celebration.

Test beta versions of jQuery projects as soon as they arrive. We want to find and fix problems before the final release. Beta versions are announced on the jQuery blogs, and bug reporting procedures are given in the blog posts as well. Read through the documentation and let us know when information is incorrect or missing. As Linus’ Law says, “Given enough eyeballs, all bugs are shallow.”

Write code, documentation, or web sites for a jQuery project. It’s not just the libraries themselves that need volunteers. The jQuery Foundation has many, many web sites at this point, and those sites always need contributions of code, documentation, or design. Watch for a blog post soon about a new site for contributors.

Get your company involved. If your company encourages employees to do open source work, consider doing that work on jQuery Foundation projects. Companies that wish to provide services and/or financial support can become corporate members of the jQuery Foundation.

Share your knowledge with the jQuery community. Join the discussion on our jQuery forum, on Stack Overflow, at user-group gatherings and conferences, or anywhere else you find jQuery being the hot topic.

Thank You!

As you can tell, the jQuery Foundation was very busy in 2012, and we’re determined to continue that pace in 2013.

We couldn’t have made such incredible progress without support from members and sponsors. jQuery Foundation member companies include WordPress, Media Temple, Adobe, RIM, Apigee, Intel, Gentics, BNOTIONS, White October, Bitovi, Davinci, Application Craft, GitHub, Go Daddy and MJG International. Significant support has also been provided by Bocoup, Filament Group, and their staff.

jQuery’s success isn’t ours alone; the web development community around the world deserves much of the credit. The breadth and scope of the jQuery ecosystem shows that it is thriving, and it continues to grow thanks to your support. Let’s make 2013 another great year for web developers!

Dave Methvin
President, jQuery Foundation

jQuery 1.9 RC1 and Migrate RC1 Released

Posted on by

Drop everything and start testing, jQuery 1.9 Release Candidate 1 is now available! Today we’re also releasing RC1 of the jQuery Migrate plugin, to help in migrating and upgrading your older jQuery code and plugins. We really need your help to make sure this code is free of bugs and ready to release.

The jQuery 1.9RC1 files are available on jQuery’s CDN. We recommend that you start by including the jQuery Migrate plugin. Be sure to check the browser’s console for warnings, which all start with JQMIGRATE and are described in the plugin’s documentation. Just replace your current jQuery include with this:

<script src="http://code.jquery.com/jquery-1.9.0rc1.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.0.0rc1.js"></script>

For diagnostic purposes, you can also include the jQuery Migrate plugin with versions of jQuery all the way back to 1.6.4 to see what changes may cause issues with your code when you do upgrade. At minimum, please test your site with your existing jQuery version and the jQuery Migrate plugin to see what it reports. Our goal is to make the jQuery Migrate plugin into a tool that can smooth out any bumps in your upgrade road.

If you haven’t looked at the previous 1.9 beta, check out the jQuery 1.9 Upgrade Guide for information about what has changed in this go-round. There’s been quite a bit of API cleanup in 1.9, and the jQuery Migrate plugin is your friend when it comes to finding issues.

In the last beta we introduced a powerful CSS array getter that simplifies and optimizes getting multiple properties. But then we looked, and oh, I dunno, it seemed like this release just needed to “pop” more. So we added more features to make your development life easier.

New! Sizzle Selectors

Sizzle now supports the following additional CSS3 selectors: :nth-last-child, :nth-of-type, :nth-last-of-type, :first-of-type, :last-of-type, :only-of-type, :target, :root, and :lang. That means all those selectors are usable in every browser jQuery supports all the way back to IE6, regardless of native browser support for the selector. There are only three remaining selectors unsupported by Sizzle/jQuery (:link, :visited, and :hover) which we won’t implement due to the overhead of events that would be required to track active elements.

New! .finish() Method

jQuery animations have gotten even better, and our API improved in the process. It all started with a suggestion to eliminate the Boolean trap posed by the .stop(Boolean, Boolean) signature. During that discussion it became clear that we didn’t have a way to handle one of the most useful cases: running all queued animations to their final value. So we added one, .finish(). The best way to show its benefits is with an example.

As you can see from the example, most uses of the .stop() API requiring Boolean arguments can be replaced with some combination of .stop() (with no arguments), .clearQueue() and/or .finish() and be less cryptic. We’re not removing the old behavior though, so any existing code should work fine. We’d prefer that you use .finish() when appropriate, since it reads better and avoids confusing Boolean parameters. And, when you need to go to the end of a whole series of animations, .finish() will do that in 1.9 when nothing would before.

New! Source Maps

jQuery 1.9RC1 has added the ability to use source maps in browsers that support them. At the moment that’s just Google Chrome, but Mozilla Firefox is planning support as well.

What’s all this about? Well imagine that you are using compressed versions of your files on your production site, including a compressed version of jQuery. You get a report that an important customer is running into a problem. You could debug it a lot easier if you had the uncompressed source, but using that on your high-traffic production site isn’t an option. With source maps, you can let the browser’s debugger “map” the lines in the compressed file into the uncompressed source. That makes it so much easier to set breakpoints, inspect or change values, and see meaningful variable names. This video gives you a taste of what it can do.

The jQuery CDN has the map files for this beta version; the jQuery, Google, and Microsoft CDN versions of jQuery final releases will also get matching source maps from now on. If you are using jQuery 1.9 or 2.0 from the CDN, just check the “Use source maps” option in the debugger and you will be set. Open the uncompressed version of jQuery in the Chrome debugger and you can set breakpoints or inspect variable values there, even though the compressed version is being used!

When hosting your own copy of jQuery, copy the map to your server and use it from there. For simplicity we assume that the compressed and uncompressed copy of jQuery is in the same folder as the map file; this is the case for CDN versions and you should follow the same rule if you make local copies. The map file name is the same as the compressed version, with .map replacing .js. Do not rename the files when you copy them. So, if you were to use a local copy of jquery-1.9.0.min.js the corresponding map file would be jquery-1.9.0.min.map and the uncompressed file would be jquery-1.9.0.js in the same folder.

Congrats, Contributors!

Many thanks to the people who have contributed to the 1.9 release: Akintayo Akinwunmi, Alexander Farkas, Allen J Schmidt Jr, Ben Truyman, Bennett Sorbo, Callum Macrae, Carl Danley, Corey Frang, Daniel Gálvez, Dan Morgan, David Bonner, David Fox, Devin Cooper, Elijah Manor, Erick Ruiz de Chavez, Greg Lavallee, Ismail Khair, James Huston, Jay Merrifield, Jonathan Sampson, Julian Aubourg, Marcel Greter, Matt Farmer, Matthias Jäggli, Mike Petrovich, Mike Sherov, Oleg Gaidarenko, Paul Ramos, Richard Gibson, Rick Waldron, Rod Vagg, Roland Eckl, Sai Wong, Scott González, Sebi Burkhard, Timmy Willison, Timo Tijhof, Tom Fuertes, Toyama Nao, and Yi Ming He.

jQuery 1.9.0RC1 Changelog

Ajax

  • #12004: Rename ajax.type to ajax.method
  • #12550: jQuery Ajax cache=false doesn't always work

Attributes

  • #9905: .removeAttr( "id" ) sometimes crashes IE 7
  • #10299: hrefNormalized === false also needs a propHook
  • #12048: [IE6/7/8] xml set attribute
  • #12584: jQuery wrongly serializes &lt;select&gt; with one disabled &lt;option&gt;
  • #12600: jQuery('select').is('[value="value"]') works inconsistently depending on number of elements returned
  • #12945: attr throws exception in IE9 on Flash &lt;object&gt;s
  • #13011: Setting type attribute on an input doesn't work as intended

Build

  • #12254: Reflected XSS
  • #12490: Move submodule update process to grunt
  • #12725: Avoid localized UTF-8 characters in intro.js @DATE
  • #12741: inconsistent line endings in official jquery-1.8.2.js download
  • #12886: Add source map support for build
  • #13044: Execute all QUnit modules in TestSwarm
  • #13064: Improve test suite fixture cleanup

Core

  • #9469: Remove semi-functional .selector calculation from .pushStack()
  • #9904: Move deprecated functionality to compatibility plugin
  • #10417: jQuery.later
  • #11290: selector interpreted as HTML
  • #11737: Remove jQuery.sub
  • #12107: Change proxy to allow arguments currying without overwriting context
  • #12134: implement HTML5 compilant form data construction into $.fn.serialzeArray
  • #12191: jQuery.type() should return "error" for native ECMAScript Error objects
  • #12519: Public API methods should not have private arguments
  • #12840: Remove (private) parameter "pass" from jQuery.attr and jQuery.access
  • #13021: each() cannot work well with a literal object who has a length member
  • #13075: Performance optimization for $.type
  • #13076: Performance optimization (10-30%) for $("some-selector")

Css

  • #11938: jQuery.css should accept an array to get multiple properties
  • #12990: 'px' automatically added to column-count css property
  • #13088: under IE8, $(selector).attr('style') always return lowercase string

Data

  • #10544: Remove ALL special meanings of "." in keys for $.fn.data

Deferred

  • #11405: deferred.notify() invokes progressCallbacks with deferred as context
  • #13160: Deferred.then doesn't propagete custom context

Effects

  • #12803: Smarter hook point for jQuery.timer

Event

  • #3827: Checkbox state inconsistent in click event handler
  • #12061: $(window).beforeunload() clobbers previous handler and return values
  • #12518: Don't use offsetWidth in jQuery.event.trigger()
  • #12610: jQuery.event.dispatch should remove window.event
  • #12736: Move pseudo:hover to jquery-compat / deprecated.js
  • #12739: Name: Passing in an Event to trigger strips namespace
  • #12827: Remove "exclusive" events
  • #12828: Remove event properties: attrChange attrName relatedNode srcElement

Manipulation

  • #4087: insertAfter, insertBefore, etc do not work when destination is original element
  • #9646: IE7: Cloning of form-elements and changing their names also changes the name of the elements that are cloned.
  • #10470: wrap() evaluates scripts
  • #11226: .after and .before returns incorrect data for $('not_existing_element')
  • #11230: .appendTo .prependTo .insertAfter .insertBefore returns incorrect data for $('not_existing_element')
  • #11280: appending elements to an object element fails in IE &lt; 9
  • #11795: Resolve script manipulation/execution inconsistencies
  • #12120: Inconsistency of .end() with respect to .after()
  • #12336: Calling $('#select').empty() should set options length to 0
  • #12392: Elements created from HTML strings have a parentNode
  • #12449: replaceWith() doesn't clone elements where required
  • #12503: before/after will choke if collection has not first disconnected node
  • #12777: Applets don't work when appended on IE
  • #12863: behavior:url(#default#savehistory) causes event error on oldIE
  • #12957: Improve wrapMap
  • #13019: New pre-1.9 .replaceWith() behavior leaks data and events
  • #13094: If to jQuery#before passed function argument it should receive index of the current element in the set

Misc

  • #12758: Make sure Summit new authors are credited

Offset

  • #6446: Mobile Safari 4.0.4: $.offset.top() reports wrong position after scroll

Selector

  • #11115: ".is()" and ".filter()" disagree on attribute selector "[checked]"
  • #12856: Syntax error, unrecognized expression in jquery 1.8+
  • #13070: filter()/is() does not work correctly with attribute equals selector which contains special characters

Support

  • #12569: Improve feature detect for oldIE event bubbling
  • #12869: Support tests affect page layout in IE8/9/10 running in IE7 mode

Traversing

  • #12009: jQueryObject.find(element) corrupts the stack
  • #12816: .find can return elements in the wrong order

jQuery 1.9 Beta 1 Released

Posted on by

You’ve been good boys and girls this year, so look what Santa left under the source tree: jQuery 1.9 Beta 1! We’ve made a lot of changes this time, so we need your help in testing more than ever. Please don’t leave us feeling awkward at the holiday party with that punch bowl full of warm eggnog and the creepy guy from accounting. Just take a few minutes out of your holiday schedule and try this with your code. It’s a gift we will definitely appreciate.

jQuery 1.9 has removed many of the items we deprecated during the last few versions of jQuery. For that reason, we’re introducing the jQuery Migrate plugin. This plugin restores several of the deprecated and removed features so that existing code can run, without changing the code. However, it’s intended as a short-term stopgap and shouldn’t be used for new work. To make migration easier, the development version (linked below) also provides browser console warnings to let you know which obsolete features the code is still using. See the plugin documentation for a list of messages you may see.

To test, we recommend that you start with the jQuery Migrate plugin since it will warn you about any deprecated features the code may depend on. Just include these two script tags in your code, replacing your existing jQuery script include:

<script src="http://code.jquery.com/jquery-1.9.0b1.js"></script>
<script src="http://code.jquery.com/jquery-migrate-1.0.0b1.js"></script>

Be sure to update to the most recent versions of jQuery UI and jQuery Mobile if you are also using them.

If the browser’s console does not show any “JQMIGRATE” warning messages generated by the jQuery Migrate plugin, try removing the jquery-migrate include and try jQuery 1.9 in all its squeaky-clean glory. If you have questions, feedback, or complaints about the beta that aren’t specifically bugs, let us know in the jQuery Forum.

Issues regarding the migration plugin not discussed below or in the upgrade guide can be reported at the jQuery Migrate Issue tracker; include a test case that we can use to diagnose the problem. The best way to do that is create a simple test at jsFiddle.net or jsbin.com. You can this jsFiddle tempate or jsbin template as a starting point; they already contain links to the work-in-progress versions of both jQuery and the jQuery Migrate plugin. Add your code there and post a link to it with your bug report.

If you’re seeing problems after fixing any migration issues, removing jQuery Migrate, and using the 1.9 beta by itself, you can report them at the main jQuery core bug tracker. A test case is essential here as well so that we can analyze the problem. Again, if you have questions, feedback, or complaints about the beta that aren’t specifically bug reports, use the jQuery Forum.

What’s New

The majority of work in 1.9 has revolved around API cleanup. Changes most likely to affect existing code are listed in the jQuery 1.9 Upgrade Guide, and these changes will also carry over to 2.0. The jQuery Migrate plugin will identify many of these issues for you automatically, so it’s good to use the plugin in your initial testing to see if it identifies anything that needs to be changed.

We couldn’t let a version like this escape without adding at least one new feature; it’s a good one.

$(element).css([ name1, name2 … ]): This is a new getter that retrieves multiple CSS properties for the first element in a collection and returns them as an object with properties. In addition to the shorter code, this signature provides up to 25 percent better performance because it can use the same return value from the browser’s `.getComputedStyle()` method rather calling the method for each css property. Typical use might be like this:

var dims = $("#box").css([ "width", "height", "backgroundColor" ]);
//  { width: "10px", height: "20px", backgroundColor: "#D00DAD" }

Finally, no major version would be complete without fixes for a variety of bugs and peculiar edge cases that you’ve discovered and reported on the bug tracker. Those, along with all the other modifications, are all cataloged in the changelog below.

How It’s Made

Possibly the most exciting news of this beta is that so many contributors — new and veteran — worked to make jQuery better. Our first jQuery Developer Summit in October brought in some incredibly skilled developers that we hope will continue to stay with us, and several new contributors dared to tackle bugs that have been open for more than a year! If you’re interested, you can help out too.

Let’s give a round of applause to the people who contributed their code gifts to this 1.9 beta: Akintayo Akinwunmi, Alexander Farkas, Allen J Schmidt Jr, Ben Truyman, Bennett Sorbo, Callum Macrae, Carl Danley, Corey Frang, Daniel Gálvez, Dan Morgan, David Bonner, David Fox, Devin Cooper, Elijah Manor, Erick Ruiz de Chavez, Greg Lavallee, Ismail Khair, James Huston, Jay Merrifield, Jonathan Sampson, Julian Aubourg, Marcel Greter, Matt Farmer, Matthias Jäggli, Mike Petrovich, Mike Sherov, Oleg Gaidarenko, Paul Ramos, Richard Gibson, Rick Waldron, Rod Vagg, Roland Eckl, Sai Wong, Scott González, Timmy Willison, Timo Tijhof, Tom Fuertes, and Yi Ming He. If you happen to see them under the mistletoe … well, you know what to do.

jQuery 1.9 Beta 1 Change Log

Ajax

  • #12004: Rename ajax.type to ajax.method
  • #12550: jQuery Ajax cache=false doesn't always work

Attributes

  • #10299: hrefNormalized === false also needs a propHook
  • #12048: [IE6/7/8] xml set attribute
  • #12584: jQuery wrongly serializes select with one disabled option
  • #12600: jQuery('select').is('[value="value"]') works inconsistently depending on number of elements returned
  • #13011: Setting type attribute on an input doesn't work as intended

Build

  • #12254: Reflected XSS
  • #12490: Move submodule update process to grunt
  • #12725: Avoid localized UTF-8 characters in intro.js @DATE
  • #13044: Execute all QUnit modules in TestSwarm
  • #13064: Improve test suite fixture cleanup

Core

  • #9469: Remove semi-functional .selector calculation from .pushStack()
  • #9904: Move deprecated functionality to compatibility plugin
  • #10417: jQuery.later
  • #11290: selector interpreted as HTML
  • #11737: Remove jQuery.sub
  • #12107: Change proxy to allow arguments currying without overwriting context
  • #12134: implement HTML5 compilant form data construction into $.fn.serialzeArray
  • #12191: jQuery.type() should return "error" for native ECMAScript Error objects
  • #12519: Public API methods should not have private arguments
  • #12840: Remove (private) parameter "pass" from jQuery.attr and jQuery.access
  • #13021: each() cannot work well with a literal object who has a length member

Css

  • #11938: jQuery.css should accept an array to get multiple properties
  • #12990: 'px' automatically added to column-count css property

Data

  • #10544: Remove ALL special meanings of "." in keys for $.fn.data

Deferred

  • #11405: deferred.notify() invokes progressCallbacks with deferred as context

Effects

  • #12803: Smarter hook point for jQuery.timer

Event

  • #3827: Checkbox state inconsistent in click event handler
  • #12061: $(window).beforeunload() clobbers previous handler and return values
  • #12518: Don't use offsetWidth in jQuery.event.trigger()
  • #12610: jQuery.event.dispatch should remove window.event
  • #12736: Move pseudo:hover to jquery-compat / deprecated.js
  • #12739: Name: Passing in an Event to trigger strips namespace
  • #12827: Remove "exclusive" events
  • #12828: Remove event properties: attrChange attrName relatedNode srcElement

Manipulation

  • #4087: insertAfter, insertBefore, etc do not work when destination is original element
  • #9646: IE7: Cloning of form-elements and changing their names also changes the name of the elements that are cloned.
  • #10470: wrap() evaluates scripts
  • #11226: .after and .before returns incorrect data for $('not_existing_element')
  • #11230: .appendTo .prependTo .insertAfter .insertBefore returns incorrect data for $('not_existing_element')
  • #11280: appending elements to an object element fails in IE &lt; 9
  • #11795: Resolve script manipulation/execution inconsistencies
  • #12120: Inconsistency of .end() with respect to .after()
  • #12392: Elements created from HTML strings have a parentNode
  • #12449: replaceWith() doesn't clone elements where required
  • #12503: before/after will choke if collection has not first disconnected node
  • #12777: Applets don't work when appended on IE
  • #12957: Improve wrapMap
  • #13013: Move jQuery.buildFragment() to compat plugin
  • #13019: New pre-1.9 .replaceWith() behavior leaks data and events

Misc

  • #12758: Make sure Summit new authors are credited

Offset

  • #6446: Mobile Safari 4.0.4: $.offset.top() reports wrong position after scroll

Selector

  • #11115: ".is()" and ".filter()" disagree on attribute selector "[checked]"
  • #12856: Syntax error, unrecognized expression in jquery 1.8+

Support

  • #12869: Support tests affect page layout in IE8/9/10 running in IE7 mode

Traversing

  • #12009: jQueryObject.find(element) corrupts the stack
  • #12816: .find can return elements in the wrong order

NOTE: Please do not report bugs or other problems via blog comments!

jQuery Color 2.1.1 Released

Posted on by

Just a quick announcement: jQuery Color 2.1.1 is now released! This adds a few bug fixes to the 2.1.0 release and I would suggest upgrading as soon as possible to avoid encountering these bugs.

Changelog

  • Ensure white and black both have a saturation of 0 to keep them in greyscale color space.
  • Add support for ‘.25′ instead of ‘0.25’ for alpha string parsing

Download

Thanks!

Special thanks going out to Mike Sherov, Ben Olson, Dmitry, and antoniojrod for helping with this release!

Issues

As always, if you encounter any issues, please do not post replys on this blog post, instead visit jquery-color issues on github.

jQuery 1.8.2 Released

Posted on by

We’re pleased to announce that jQuery 1.8.2 is available! This version fixes several bugs and performance regressions reported from the past couple of releases, and we think the 1.8 line is pretty solid at this point. The only way to know for sure that it works with your code is to test it–so please do!

As always, we have put out the jQuery-shaped signal lights; the master control centers at the Google and Microsoft CDNs are on high alert and will soon post these files. For immediate relief, please use the copies above. If you find a problem, please post a bug report and be sure to include a test case from jsfiddle.net or jsbin.com.

The complete change log for jQuery 1.8.2 is below. If this is your first upgrade to the 1.8 line, be sure to read the blog entries for 1.8.0 and 1.8.1 to see what’s changed.

Many thanks to the patch contributors for this version; ye shall know them by their GitHub handles: timmywil, gibson042, rwldrn, joyvuu-dave, jaubourg, staabm, and sindresorhus. In addition, we thank all the community members who took the time to contribute quality bug reports with test cases. Your initial groundwork makes it possible for us to find and fix bugs.

jQuery 1.8.2 Change Log

Deferred

  • #12521: Deferred.promise( target) only works fine when typeof( target)=='object'

Event

  • #12423: jQuery breaks with Comcast Protection Guard and any anti-keylogging protection software on IE7+
  • #12436: Performance degradation with delegate events and pseudo-classes

Misc

  • #12229: Some inconsistencies/optimizations

Offset

  • #12534: .offset() throws an error on BlackBerry5 and iOS3
  • #12536: Make .offset() calc less wrong on browsers w/o getBoundingClientRect

Selector

  • #12303: Attribute selector fails if the attribute value contains :first :last
  • #12337: :nth-child selector not accurate after new child element added
  • #12361: seleter has bug
  • #12448: :contains() edge case throwing an error
  • #12492: In textarea focus event handler, $(this).is(':focus') == false in Chrome & Safari
  • #12523: JQuery renders line breaks as text nodes
  • #12526: :last selector fails to find a match
  • #12541: 1.8.0 and 1.8.1: Double :not() selector fails in IE6/7
  • #12572: :contains breaks searching iframes v1.8

Traversing

  • #12474: Using find on a collection with append does not return the correct elements

Help Us Money-ify UglifyJS 2.0

Posted on by

In nature, an ecosystem consists of the organisms, raw materials, and all of the complex interactions that shape their shared environment. The open source ecosystem is no different. Each project has its niche, and any package that is a dependency of course has dependencies of its own. jQuery is used on millions of websites, but we wouldn’t be there without the excellent tools on which we rely to build, test, and distribute our code.

One such tool is Mihai Bazon’s excellent UglifyJS. We’ve been using Uglify to compress jQuery, jQuery UI, and jQuery Mobile for nearly two years now, so if you’ve used any of our minified builds recently, you’ve benefited from Mihai’s work. Recently, he began work on UglifyJS 2.0, which will feature even better compression, support for source maps, and a command line utility. He also announced a Pledgie campaign to support his efforts.

Here at the Foundation, our goal is not just to improve libraries that start with “jQuery,” but rather the entire JavaScript ecosystem in which we all participate. That’s why we’re happy today to announce some exciting news – and to issue a challenge!

Help build UglifyJS 2.0!
Click here to lend your support to: Funding development of UglifyJS 2.0 and make a donation at www.pledgie.com !

We’ve just kicked in 500€ to the campaign to recognize his work so far, but there’s more we all can do. If the community can help us to help Mihai reach his goal of 3,000€  by the end of September, we’ll donate an additional 500€ to the UglifyJS 2.0 project!

We’re looking forward to keeping you posted on the progress here, and participating in similar endeavors in the future to help improve the tools we use each day. In the meantime, thanks for considering a donation (even a small one), and if we haven’t convinced you yet, perhaps this final exhortation will: THINK OF THE BYTES!

Update (5:30): Awesome! The Dojo Foundation has matched our donation!

jQuery 1.8.1 Released

Posted on by

It’s been a frantic but productive few weeks, and the jQuery core team is pleased to announce that jQuery 1.8.1 is released! This version fixes the issues reported by the community following the final release of 1.8.0. Here are the files, ready for you to use:

The Google and Microsoft CDNs will also have copies available soon.

The final set of bugs that were fixed are listed below. Don’t forget, folks, we love to hear about bugs in the betas and release candidates too! You don’t have to wait for a final release to test with your code. The earlier we can fix these bugs, the smoother things go for both the team and the jQuery community.

Use jQuery UI 1.8.23 and jQuery Mobile 1.1.1 or later for best compatibility with jQuery core 1.8.1.

Don’t use Quirks mode! jQuery has never supported Quirks mode and we do not perform any testing in Quirks. This can affect values like $("window").height(), and the jQuery 1.8 Quirks mode results did change in order to support some modern browser features. The majority of problem cases we’ve seen are from developers that wanted to be in Standards mode but had an invalid doctype or extraneous markup before their <html> tag. When in doubt, use the simple and short <!doctype html>.

Sizzle’s custom pseudo-selectors that take arguments have changed, but jQuery 1.8.1 provides a compatibility shim for older code. Neither Sizzle nor jQuery documented how these worked before; there is now official documentation for Sizzle. Look there for an example of best practice on writing custom pseudo-selectors that work with all versions of jQuery.

Many thanks to the team and community members who contributed patches for this release: Timmy Willison, Mike Sherov, Elijah Manor, Mike Pennisi, Richard Gibson, Corey Frang, Mathias Bynens, Oleg Gaidarenko, Nikita Govorov, Julian Aubourg, and Rick Waldron.

We’re also very appreciative to those of you who took the time to create good bug reports for jQuery 1.8.1. In the highly unlikely event we somehow managed to leave any bugs in this release, please do let us know. First check the bug tracker to see if it has already been reported. If not, create a test case using jsFiddle.net or jsbin.com with the least possible code that it takes to demonstrate the problem.

jQuery 1.8.1 Change Log

Ajax

  • #12233: jQuery.post() raises "RangeError: Maximum call stack size exceeded"
  • #12234: the .load() method,when params is null, the ajax type will be "POST", but not be "GET"

Core

  • #12282: 1.8.0 regression – document ready is fired too early on IE 9/10
  • #12329: event.js still has a reference to bindReady
  • #12350: jQuery.trim should remove byte-order-mark (BOM) characters
  • #12370: jquery android 2.1-update1 problem

Css

  • #12235: getComputedStyle is used without namespace
  • #12313: .height() and .width() no longer fall back to CSS if offsetWidth is undefined.
  • #12324: cssNormalTransform can produce wrong values

Data

  • #10863: .data method does not return an object if the JSON string contains newlines.

Dimensions

  • #12283: jQuery 1.8 outerHeight is returning undefined instead of null

Effects

  • #12273: animate fails with 0 duration

Event

  • #12149: 'change' event handler leaks in IE7/8
  • #12383: jQuery.on() selector should only apply to descendants of the element

Manipulation

  • #12346: fn.append not working correctly
  • #12384: .after fails with table rows in IE9

Queue

  • #12278: .promise(type) not working for non-default queue

Selector

  • #12205: Miscellaneous pseudo selector issues
  • #12237: Having child selector and multiple :not with :visible does not work any more
  • #12241: Passing a negative index for :eq throws a syntax error.
  • #12285: Selector with :not(:first) isn't working since 1.8
  • #12292: Invalid selectors can cause a subsequent valid selector not to work
  • #12303: Attribute selector fails if the attribute value contains :first :last
  • #12311: jQuery 1.8 and .is(":visible")
  • #12314: $.contains fatal error in IE9 when 2nd parameter is null
  • #12359: 1.8.0 creating invalid tag/attribute when loading the library
  • #12369: ajax, use find method for read xml
  • #12403: Selector "> li > :first-child,> :not(li):even" fails in old IE
  • #12409: Back-compat issue with custom pseudo selectors
  • #12412: Sizzle regression ":not([data-role='list-divider']):not(:hidden)"
  • #12419: Composite selector fails if id attribute contains dot.

Support

  • #12333: $.browser.webkit (undefined) -> $.browser.chrome

jQuery Color 2.1.0

Posted on by

Early last week I released jQuery Color 2.0.0, the wait for a jQuery Color plugin that gives you an API to work with colors is over.

What’s new in jQuery Color 2.0.0?

jQuery Color has faithfully supported animating colors between two hex values since the beginning. Many developers asked for access to the internal functions we had declared to make it all possible. Version 2 now includes an API to create and modify colors, as well as support for RGBA & HSLA colors and animations.

You can read more about the API and features on the repository readme.

Any issues should be reported on the issue tracker.

Why jQuery Color 2.1.0 already?

It’s every developers dream to land a major version perfectly on the first release, but it is rarely achieved. In the last two weeks a few minor bugs that were left in 2.0.0 have been fixed, and a new function was added to the API which should help support SVG style properties.

Download jQuery Color 2.1.0

You can download the release from our CDN provided by Media Temple.

In order to save on file size, the jQuery Color plugin only supports the Basic color keywords by default, the Extended Color Keywords are included in a separate file. If you want to include both, you can also download the bundled version.

Credits

Thanks go out to Dan Heberden, Scott González, Jörn Zaefferer, Mike Sherov, Brendan Byrd, and Christoffer Sawicki who helped make this release happen.

jQuery 1.8 box-sizing: width(), css(“width”), and outerWidth()

Posted on by

One of the great new features in jQuery 1.8 is a built-in understanding of box-sizing: border-box which is supported by every modern browser. (Sorry, IE6 and IE7, please take one step back; I said modern browser.)

If you showed people an element with a border on the screen and asked them the width of that element, they would naturally measure from the outside edges of the border. Yet that’s not the way CSS works in its default content-box mode. Normally, CSS width and height only include the “content” inside the border and padding. As a result, designers (and jQuery) often need to add the width to the right/left padding and border to get the “natural” width of the element.

Using box-sizing: border-box changes the CSS notion of the width of an element to include both the padding and the border dimensions, just the way you’d naturally measure it. jQuery versions before 1.8 were not fully trained in the ways of the border-box, but we’ve fixed this bug.

One thing that hasn’t changed is the return value of the .width() method. As it’s always been documented, it gets and/or sets the “content” width of an element, and that is regardless of the CSS box-sizing being used by the element. However, jQuery 1.8 now needs to check the box-sizing property whenever you use .width() so that it can decide whether it needs to subtract out the padding and border width. That can be expensive—up to 100 times more expensive on Chrome! Fortunately, most code doesn’t use .width() enough times for this to be noticeable, but code that gets the width of dozens of elements at once could be impacted.

There is a very easy way to avoid this performance penalty if it does impact your code. Simply use .css("width") instead of .width() to make it clear you want to get or set the actual width of the element as specified by the CSS. That doesn’t require jQuery to look at box-sizing. Remember, however, that .css("width") as a getter returns a string with “px” at the end, so you’ll want to use something like parseFloat( $(element).css("width") ) for situations where the result must be numeric.

And of course, everything mentioned here about .width() also applies to .height() as well; use .css("height") to skirt the performance penalty there.

Using .outerWidth() as a setter

In other dimensionally related news, jQuery’s .outerWidth() and .outerHeight() methods have been updated in 1.8 so that they can be used as setters. (jQuery UI has supported them as setters since UI version 1.8.4, but now it’s built into core.) To use .outerWidth() as a setter, pass an argument that is a number representing the outer width (CSS “content” width, plus padding and border width). And yes, this handles the box-sizing: border-box situation fine as well; it’s basically the same as setting the .css("width") in that case.

We’ve received a few reports from people who had problems with .outerWidth() in jQuery 1.8 because it was returning the jQuery object instead of a numeric width. This happens if you call $(element).outerWidth(0) for example. Before jQuery 1.8, this was an invalid use of the API because it was documented to accept a single Boolean argument. However, it treated the invalid argument as a Boolean and returned the width. In 1.8, jQuery uses the value 0 to set the width, and like most setters it returns the jQuery object.

We’re in the process of updating the API documentation for all the changes to 1.8, but for now you can refer back to the changelog in the jQuery 1.8 announcement to see what’s changed.

jQuery 1.8 RC1 Released

Posted on by

jQuery 1.8RC1 is here. Yep, RC as in Release Candidate. The good news is that this release is a few days later than I expected it to be. It’s good news because we received several valuable but last-minute bug reports we were able to fix. Many thanks to those of you who took the time to try out Beta 2 with your code, and especially to those who found and reported bugs.

Now I know there are a lot of you out there thinking, “Gee whiz, nobody ever lets me find bugs.” Well, here’s your chance to be a hero to the jQuery community. In this Release Candidate we may have taken some working features and inserted problems so obscure that even we don’t know where they are. Please find them! Just grab the code from here:

http://code.jquery.com/jquery-1.8rc1.js

Try out this Release Candidate code wherever you use jQuery, and let us know about any issues you find via the bug tracker. Be sure to mention you’re testing against jQuery 1.8 RC1, and please create a test case that shows the bug using jsFiddle.net so we can reproduce it and investigate. You can use the “jQuery (edge)” choice for framework in jsFiddle, which represents the most up-to-date code.

Oh, and did I mention this is a Release Candidate? Yeah, I did. Who knows if there will ever be a jQuery 1.8.1? If you find a bug after we release jQuery 1.8, it could be six months before it’s fixed. Six months of misery, all because you didn’t test the Release Candidate! One and a half women could make a baby while you’re waiting for that critical bug fix! For your own sake, please try it out!

jQuery 1.8rc1 Change Log

The current change log of the 1.8rc1 release.

Ajax

  • #8205: JSONP random result is causing memory leak in IE8
  • #8653: jQuery.param outputs "null" and "undefined" in the query string
  • #9399: Deprecate jqXHR.success and jqXHR.error
  • #10285: evalScript rcleanScript replacement fails in IE8
  • #10524: jQuery.fn.load does not merge data parameter with jQuery.ajaxSetup
  • #10944: $.ajax does not always return an object implementing the Promise interface
  • #11013: Deprecate use of Deferred/Promise with sync $.ajax
  • #11402: evalScript function fails with error error 80020101 in IE
  • #11743: jQuery silently ignores errors during script tag ajax request in $.appendTo()
  • #11778: Cached XHR requests should still resolve asynchronously
  • #12122: jQuery.ajax() async deprecate use with $.Deferred

Attributes

  • #11153: jQuery 1.7 Strips Carriage Returns in IE 8
  • #11212: Sizzle.getText converts unbreakable space into whitespace on IE
  • #11547: XML DOM .removeAttr() doesn't remove cased attributes
  • #11962: Standardize getter return values for empty sets.
  • #12127: Clone does not correctly copy checked state in IE10

Build

  • #11767: Support custom build without effects
  • #11789: Update README to describe grunt build system
  • #11856: modularize dimensions
  • #11857: modularize css
  • #11865: modularize offset
  • #11965: Create deprecated.js to contain as much of the deprecated stuff as possible

Core

  • #10657: Deprecate jQuery#size() in favor of jQuery#length
  • #11290: selector interpreted as HTML
  • #11470: Adding a builtin readyP promise
  • #12018: $(document).ready() fires too early in IE8
  • #12026: Let $(html, props) use any jQuery.fn method

Css

  • #10373: `document.defaultView` => `window`
  • #10413: width, innerWidth, innerHeight, outerWidth, outerHeight are inaccurate for a "box-sizing: border-box" child of hidden parent
  • #10679: CSS3 vendor prefix support
  • #11004: getWH incorrectly removes padding and border width when box-sizing is border-box
  • #11787: Remove jQuery.curCSS
  • #12088: Webkit now returning percentages for more getComputedStyle properties
  • #12148: hide event don't fire when toggle

Data

  • #7579: jQuery.data() truncates numbers taken from data-xxx attributes
  • #10589: Remove $.fn.data("events")

Deferred

  • #11010: Make Deferred.then == Deferred.pipe like Promise/A
  • #11011: Allow traditional options object for $.Callbacks flags
  • #11736: Remove Deferred .isResolved() and .isRejected()
  • #11749: Preserve context objects when multiple Deferred object are passed to $.when()

Dimensions

  • #6724: wrong $(window).height() in mobile safari (iphone)
  • #10877: Make outerWidth/Height a setter
  • #11293: Reading width or outerWidth of empty TDs alters columns width values
  • #11604: Switch $(elem).width(-val) from no-op to $(elem).width(0)
  • #11724: $(document).height() changed in Firefox 12

Effects

  • #7109: animate width starts with invalid width on webkit
  • #7157: Animation callback shows element is still ":animated"
  • #8387: flickering problem with jQuery 1.5 hide/show issue with inline and inline-block elements on webkit browsers
  • #8627: .animate() fails on letterSpacing in IE (regression in 1.5.1)
  • #8892: Callback is raised before objects are shown with fadeIn() and jQuery.fx.off = true
  • #9217: javascript error in IE8 when animating element is removed before animation finishes
  • #9505: animate() issue when mixing percentages and pixels in WebKit
  • #11635: Explicit overflow:auto is overridden by inline overflow:hidden during animation
  • #11755: animate and it aliases should not use :hidden selector
  • #11797: New animation related events
  • #11854: percentage animations jump to end
  • #11971: Animating background-position fails in IE8
  • #11999: Incremental animation on fixed div does subtraction instead of addition in Chrome.
  • #12117: overflow hidden not properly set when animating to 0 height or width
  • #12150: border-spacing property accumulates when rows are shown and hidden

Event

  • #8545: Leak with events in IE
  • #10067: Firing $.ready on document.readyState === 'interactive' too
  • #10895: The doScrollCheck ie hack in bindReady degrades ie7 performance for no reason whatsoever
  • #11101: Deprecate "exclusive" events option from trigger method
  • #11315: Problems with delegate() and :first in nested elements with equivalent classes
  • #11328: Ctrl key doesn't set event.metaKey to true on Windows
  • #11382: Mouseenter doesn't fire on a disabled input element
  • #11500: Bug : "change" event handler not executed when triggered manually on IE7 & IE8
  • #11621: Triggering a event on document doesn't bubble to window
  • #11718: Deprecate .data() events
  • #11719: Deprecate .bind("ready") event
  • #11731: Deprecate "hover" pseudo-event
  • #11733: Deprecate .load(), .unload(), and .error() methods
  • #11764: Allow delegated non-native events on disabled elements
  • #11786: Deprecate .toggle( handler, handler, … ) signature

Manipulation

  • #8894: appendTo() and alike methods called after clone() returns incorrect jQuery set in IE
  • #10324: Clone does not copy innerHTML of object element in IE9
  • #11231: Append, Prepend, After, Before should accept an array as first argument
  • #11338: Inconsistent behavior with .replaceWith() and disconnected nodes.
  • #11528: ie8 serialization bug with .html() also hitting html5 tags
  • #11566: node.append et al. does not work when node is a DocumentFragment
  • #11617: Define a $.parseHTML method for creating HTML fragments
  • #11809: Memory leak in .text(val) setter?
  • #11898: prevAll() with a complicated :not() selector returns results in wrong order
  • #12132: IE10 bug when cloning an object element without a parentNode

Offset

  • #10996: Simplify offset()
  • #11823: Remove webkitConvertPointFromNodeToPage

Selector

  • #3778: selector matching issues
  • #5568: Selectors behave differently with comments tags on FF/IE
  • #7596: xpath selector attribute name with brackets [] fails
  • #8473: In IE9rc *[tabIndex] select all elements without tabindex also
  • #8906: .(prevAll('span:has(input,select,textarea)')
  • #9400: Deprecate :text, :radio, :checkbox, etc. selector extensions
  • #9810: Rewrite Positional Selector Logic
  • #10003: Regression/BC break from #6963
  • #10074: Chaining two [] selector with :first not working
  • #10499: :nth-child() inside :has() treated as if outside it
  • #10570: :text selector throws an error in IE7 when there is a cross domain iframe on the page
  • #10697: Sizzle revamp
  • #10799: Inconsistent results with [name="name"] selectors (also breaks .has)