About Dave Methvin

CTO, PC Pitstop http://pcpitstop.com

jQuery 1.9 and 2.0 — TL;DR Edition

Posted on by

It seems that many people had questions and misconceptions about the last post, so let’s try a short Q&A format to answer some of the comments left there.

Why is the jQuery core team dropping support for oldIE (IE 6/7/8)? We’re not! jQuery 1.9 will support oldIE when it’s released next year. The jQuery team will continue to support and maintain version 1.9 even after jQuery 2.0 is released.

Why are you making me use conditional comments to include jQuery? We’re not! You can use jQuery 1.9 for all the browsers we support, from IE6 all the way up to the latest versions of Chrome, Safari, Opera, or Internet Explorer.

What happens when jQuery 2.1 is released and adds APIs, will jQuery 1.9 support them? Can we borrow your crystal ball? jQuery 2.1 isn’t likely to arrive until 2014, so it’s hard to say what jQuery 2.1 will look like as we sit here in the middle of 2012. Our general goal is to keep the 1.x and 2.x lines in sync and add functionality via plugins; see the keynote from last week’s conference.

How long will you support jQuery 1.9? As long as oldIE is a significant factor on the web. It’s even possible that there will be further releases in the 1.x line, but we haven’t yet received the crystal ball requested in the previous question. When Microsoft drops Windows XP support in April 2014, however, it will put a hurt on the oldIE installed base.

I still have a lot of IE8 users, can’t you just drop IE6 and IE7? The oldIE browsers share many of the same flaws, so it doesn’t help to do anything less than remove all three in jQuery 2.0. If you need oldIE support of any kind, a supported jQuery 1.9 will be right there for you.

My website is in China and 22 percent of our users are still using IE6! Seems like some sort of human rights violation. Oh, and that wasn’t a question.

jQuery Core: Version 1.9 and Beyond

Posted on by

Please check out the followup post before jumping to the wrong conclusion.

As the last blog post discussed, jQuery version 1.8 is undergoing a spring cleaning to remove insecure, inefficient, ineffective, and inadvisable features. We’ve also begun the work to allow you to build custom versions that exclude parts of the library for even greater savings. Those efforts will make it possible for you to enjoy the jQuery API you need without carrying around the parts you don’t want.

Now that we’ve cleaned house, it’s time to take a look forward. There’s just one thing interfering with our vision of the future, and that’s the ghost of browsers past. Internet Explorer 6, 7, and 8–collectively, oldIE–have been a thorn in the side of web developers for a decade. Collectively, these browsers of a bygone era still represent up to one-third of users visiting some sites. That is a lot of users–people who still want the information, services and products that web sites provide. For many web sites that use jQuery, it’s not practical or profitable to ignore that audience.

jQuery was conceived specifically to address the differences in browsers, so we’re not going to abandon the essence of our philosophy and simply disregard the millions of active Internet users who (for whatever reasons) still use oldIE. Yet we also want to move ahead and take advantage of modern browsers, especially the growing mobile market.

The Road Ahead

jQuery 1.8 should arrive within a month. Here is our thinking about the next two versions of jQuery to follow it, and when they’ll arrive:

  • jQuery 1.9 (early 2013): We’ll remove many of the interfaces already deprecated in version 1.8; some of them will be available as plugins or alternative APIs supported by the jQuery project. IE 6/7/8 will be supported as today.
  • jQuery 1.9.x (ongoing in 2013 and beyond): This version will continue to get fixes for any regressions, new browser bugs, etc.
  • jQuery 2.0 (early 2013, not long after 1.9): This version will support the same APIs as jQuery 1.9 does, but removes support for IE 6/7/8 oddities such as borked event model, IE7 “attroperties”, HTML5 shims, etc.

Our goal is for 1.9 and 2.0 to be interchangeable as far as the API set they support. When 2.0 comes out, your decision on which version to choose should be as simple as this: If you need IE 6/7/8 support, choose 1.9; otherwise you can use either 1.9 or 2.0.

Questions and Answers

If jQuery 1.9 and 2.0 are basically the same API, what makes 2.0 compelling? Smaller size, better performance, and the lack of problems introduced by the need for oldIE support. We expect that we can improve error handling in the $.Deferred implementation in 2.0, for example, whereas we can’t do that as long as oldIE is supported.

My site still has many IE7/8 visitors but I want to use jQuery 2.0. Can I do that? If your web site needs oldIE support, and we expect most sites will need it for at least another year or two, you can use IE conditional comments to include version 1.9 only when visitors are using oldIE:

<!--[if lt IE 9]>
    <script src="jquery-1.9.0.js"></script>
<![endif]-->
<!--[if gte IE 9]><!-->
    <script src="jquery-2.0.0.js"></script>
<!--<![endif]-->

Why not make an “oldIE plugin” for jQuery 2.0? Special dispensations for oldIE are sprinkled throughout jQuery. Refactoring the code to provide enough hooks so that oldIE support could be added as a plugin would complicate the code for the modern browser case. Plus, developers supporting oldIE and using a public CDN would then need to include two files (jQuery 2.0 and the oldIE plugin) instead of one.

Once jQuery 2.0 is released, what happens to 1.9? In a departure from the past, we’ll continue to fix bugs in 1.9 (as minor releases). Having just gone through a spring cleaning for 1.8 and 1.9, we don’t anticipate adding a lot of new APIs in the future. Instead, we prefer to add new functionality through plugins compatible with both versions where it makes sense. So don’t feel like you’re being left behind when using version 1.9.

Is jQuery 2.0 basically for mobile devices? No. Although jQuery 2.0 will be a great fit for HTML mobile apps, including ones written with jQuery Mobile, it is not a Webkit-only library that targets just iOS and Android. In addition to mobile browsers, 2.0 will support (and be tested!) with modern desktop versions of Internet Explorer, Opera, Firefox, Safari, and Chrome.

How much smaller/faster will jQuery 2.0 be? We won’t know until we’re done, or at least close to being done. You can bet that we’ll tell you more as the release date for 2.0 draws near. Better yet, you can try the beta when it is released and see for yourself!

jQuery 1.8 Beta 1: See What’s Coming (and Going!)

Posted on by

Hello fellow jQuery users! It’s been a while since you’ve heard from us, but we haven’t been asleep. The jQuery Core Team has been heads-down working on jQuery 1.8, and our first beta release is now available! You can get the code from the jQuery CDN:

Give it a try on your current jQuery code and let us know how it works for you. If you experience issues, please file a bug, include a test case, and be sure to mention that you’re testing against jQuery 1.8 Beta 1.

There will be even more exciting jQuery news at the jQuery Conference in San Francisco later this month, with blog posts to follow.

jQuery is now powering about one-half of all the major web sites on the Internet; that’s a great success, but we’re not standing still. Web browsers and the devices they run on have undergone an incredible metamorphosis in the past six years. The process of web development is evolving to accommodate the changes that are happening. In response, jQuery continues to evolve as well.

Part of that evolution is not just knowing what to add, but what to take away. jQuery’s plugin architecture makes it easy for developers to extend the functionality that jQuery Core offers when it makes sense for their own needs. For that reason, the bar has been set pretty high for additions to Core. We don’t want to create size, complexity, or performance penalties for people who don’t need specific features.

Similarly, we have enough experience with the way that people use jQuery to know some features that originally seemed like a good idea turned out to be a not-so-good idea. Rather than carry these around forever, we want to remove them eventually. In fact, we want to make it easier to create a version of jQuery that excludes things you don’t need or want, especially for mobile environments where space can be precious.

With that in mind, here are some changes we are planning for jQuery 1.8 that will make it a better foundation for all HTML-based web pages and applications, regardless of their platform:

Modularity

As of jQuery 1.8, you can build a custom version of jQuery that excludes one or more modules if you do not need their functionality. This capability is made easy by our new build system based on Ben Alman’s awesome grunt tool. To build your own custom version, set up a copy of the jQuery core repo from Github and use the grunt command line options to exclude modules. For more information, see the README file.

The modules you can currently exclude are ajax, css, dimensions, effects, and offset. For example, if your application exclusively uses stylesheets and CSS animations via classes to control the visibility and size of items on the page, you could build a version without the css, dimensions, effects, and offset modules. If you didn’t need any of the optional modules, your custom build of jQuery would be about 21KB minified and gzipped.

Don’t worry though, building your own jQuery is completely optional. jQuery has always been, and will continue to be, distributed as a single file in both compressed and uncompressed form and available on CDNs. We still expect that to be the way most jQuery developers go, because it’s simple and painless. For example, when you include a jQuery plugin that you didn’t write, using the full jQuery ensures you won’t be bitten by some dependency lurking inside the plugin.

Vendor-Prefixed CSS Properties

The W3C had its heart in the right place when it came up with the idea to use vendor prefixes for CSS features that were not yet standardized, but it hasn’t resulted in a fairy-tale ending. Web developers are faced with the nightmare of including all the vendor-prefixed property names in stylesheets. jQuery 1.8 eases the pain a bit. We automatically take the non-prefixed property name and generate the prefix that is appropriate for the current browser, so you don’t have to. For example, on Chrome the jQuery call $("#myscroll").css("marquee-direction", "backwards") will set the CSS to -webkit-marquee-direction: backwards.

Animation (Effects)

Our code for animation had become a tangled mess over the past few years, and with 1.8 we hope we’ve brought the beast under control. It’s more than just a cleanup, though; there are several extension points that make it easier to add or modify animations. At the moment there is only preliminary documentation for the new features, but in this first beta our primary focus will be on ensuring that any existing animation code works properly.

Browsers are doing a much better job providing efficient animations today, particularly with CSS transitions. Yet there are still plenty of users who don’t have a browser capable of doing CSS-based animations. With jQuery 1.8 you get the best of both worlds. If you need to support older browsers without built-in animations, the new $.Animation provides a solid foundation and fixes many bugs from previous versions. If you need to target only modern browsers and their natively supported animations, you can do that and exclude the animation module entirely.

Sizzle CSS Selector Engine

jQuery’s selector engine has undergone a major rewrite in 1.8. The most notable benefit of this rewrite is a widespread performance improvement of selector matching as well as improved shortcuts for the most common selectors.

Additionally, Sizzle handles many more edge cases and bugs, including improved support for multiple combinators (~ > +) and better detection of browser bugs in querySelectorAll. See the bugs list below in the selector module for a complete list.

XSS Protection

By design, the $() method can create HTML elements, and will run scripts if it is passed a <script> tag with inline script or a src attribute. Developers have sometimes forgotten this, passing strings to jQuery that come from untrusted sources such as the URL or user input. In these cases, it is possible for someone to inject a script into the page that can steal cookies or compromise the page in some way.

These cross-site-scripting (XSS) attacks are common on many sites whether they use jQuery or not, but we want to ensure jQuery does not contribute to the problem. In jQuery 1.9 (the NEXT version following 1.8), we’re tightening down the “looks like HTML” rule for the $() method. A string will only be considered HTML if the first character is a less-than sign, otherwise it will be assumed to be a CSS selector.

As further protection against the inadvertent injection of scripts, jQuery 1.8 introduces a new method: $.parseHTML. It lets you specify strings as HTML and know that they will be parsed as HTML, something that $() cannot do since it also interprets strings as selectors. It also provides a way to parse HTML into a DOM fragment and control the execution of any scripts the HTML it may contain. This is particularly important in JavaScript environments controlled by Content Security Policy (CSP), since injected scripts may cause security warnings or exceptions.

For anything more than the simple case of creating single elements (e.g., $("<p/>")), and particularly for cases where strings are built from external data, we strongly recommend using $.parseHTML. As of jQuery 1.9, some HTML strings will no longer be recognized by $() as a result of these stricter rules.

Spring Cleaning

In jQuery 1.8 we’ll also be deprecating and removing “trip hazards”: APIs and features that are inefficient, ineffective or inadvisable. We realize that there will be existing jQuery code that still requires these features. To provide a low-hassle future upgrade path, we’ll be providing many of the deprecated items in a compatibility plugin after they are removed. You can follow the compatibility plugin as it is developed on its GitHub repo.

Tickets below that begin with “Deprecate” or “Remove” tell the whole story of what is changed, but here are a few changes of particular note:

$.browser: Ever since jQuery 1.4, we’ve been evangelizing that browser detection via the user agent string is a bad idea. Yet we’ve been an enabler of bad practice by continuing to offer $.browser. As of jQuery 1.9 we’ll remove it entirely and you’ll need to use the 1.9 compat plugin. If your code isn’t weaned off browser detection yet, check out Modernizr for a very thorough set of feature detections you can use instead. And of course, you’re welcome to read the tea leaves in the navigator.userAgent string directly, there’s nothing stopping you but your conscience.

$.sub: This method was introduced in jQuery 1.5, but hasn’t proved to be useful or robust enough to justify it staying in core. It will move to a compatibility plugin in jQuery 1.9.

Global ajax events: Events such as ajaxStart fired by $.ajax can currently be attached to any element–even to elements that are not in a document at all! This creates an inefficient special case, so we are deprecating that behavior in 1.8. Ajax events should be attached only on document as of 1.9.

And Much Much More…

There are many other changes in 1.8, perhaps the easiest way to see what we’ve been up to is to look at the list of issues that are being fixed, which includes both features and bug fixes. Here is a snapshot of 1.8 as it stands today, but it’s not set in stone. We welcome your feedback about specific issues or the direction of jQuery in general!

jQuery 1.8 Beta 1 Change Log

The current change log of the 1.8 Beta 1 release.

Ajax

  • #8205: JSONP random result is causing memory leak in IE8
  • #8653: jQuery.param outputs "null" and "undefined" in the query string
  • #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/remove async option from $.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

Attributes

  • #11153: jQuery 1.7 Strips Carriage Returns in IE 8
  • #11212: Sizzle.getText converts unbreakable space into whitespace on IE

Build

  • #11767: Support custom build without effects
  • #11789: Update README to describe grunt build system
  • #11856: modularize dimensions
  • #11857: modularize css
  • #11865: modularize offset

Core

  • #10657: Deprecate/remove jQuery#size() in favor of jQuery#length
  • #11290: selector interpreted as HTML
  • #11470: Adding a builtin readyP promise

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

Data

  • #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
  • #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
  • #11854: percentage animations jump to end

Event

  • #8545: Leak with events in IE
  • #10067: Firing $.ready on document.readyState === 'interactive' too
  • #11101: Deprecate "exclusive" events option from trigger method
  • #11328: Ctrl key doesn't set event.metaKey to true on Windows
  • #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
  • #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.
  • #11566: node.append et al. does not work when node is a DocumentFragment
  • #11617: Define a $.parseHTML method for creating HTML fragments

Offset

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

Selector

  • #3778: selector matching issues
  • #5568: Selectors behave differently with comments tags on FF/IE
  • #8473: In IE9rc *[tabIndex] select all elements without tabindex also
  • #9400: Deprecate :text, :radio, :checkbox, etc. selector extensions
  • #10003: Regression/BC break from #6963
  • #10074: Chaining two [] selector with :first not working
  • #10570: :text selector throws an error in IE7 when there is a cross domain iframe on the page
  • #10697: Sizzle revamp
  • #10809: incorrect test using ".activeElement" in the :focus pseudo-class resolver
  • #11109: Sizzle: Expr.relative truncates prematurely
  • #11814: Sizzle's element-rooted QSA strategy (i.e. attaching a temporary id) does not account for comma and other other selector divisions
  • #11826: Explore a parsed caching system for matchesSelector within Sizzle

Support

  • #9385: Deprecate jQuery.browser
  • #11439: jQuery.support.parentNode used, but not defined any more.
  • #11721: deprecate and remove internal uses of jQuery.support.boxModel
  • #11766: Move jQuery.support to "unstable" status

Traversing

  • #9800: New method: .addBack (supersedes .andSelf)
  • #11543: .has doesn't work on detached elements
  • #11706: `.has()` fails on document fragments
  • #11738: Remove .closest(Array) returning Array

Unfiled

  • #11325: Improve domManip/buildFragment/clean
  • #11435: Obsolete test code to remove toJSON from .data's return value
  • #11777: Add jQuery Core support for EditorConfig file

jQuery 1.7.2 Released

Posted on by

jQuery 1.7.2 is looking good! The release candidate went smoothly so we’ve made only one small change and are releasing it to your eager hands today. You can get the oven-fresh code from the jQuery CDN now, with Google and Microsoft CDNs soon to follow:

Note: If you’re using jQuery Mobile, please use jQuery 1.7.2 only with jQuery Mobile 1.1. For previous versions of jQuery Mobile, stay with jQuery core 1.7.1 or earlier.

You can use the bug tracker to report bugs; be sure to create a test case on jsFiddle so we can figure it out easily. If you’re not sure it’s a bug, ask on our forum or on StackOverflow. Please don’t use the blog comments below to report bugs.

As always, this release wouldn’t have been possible without the hard work of many people. First, the jQuery Core Team: gnarf, jaubourg, mikesherov, rwldrn, and timmywil. The support of the jQuery UI, Mobile, and Infrastructure teams was greatly appreciated as well, especially danheberden’s valiant struggle against Trac.

Community members like adebree, caii, cmc3cn, KYSergey, mathiasbynens, miskith, MrMamen, Orkel, pasky, SineSwiper, tavelli, and vlazar pitched in by reporting, verifying, and fixing bugs. Special jQuery Gold Leaf Cluster thanks to gibson042 and sindresorhus for their work in making 1.7.2 a great release. Don’t let these people have all the fun! If you’d like to contribute to the web’s most popular Javascript library, hop onto #jquery-dev on IRC or the Developing jQuery Core section on our forum and say hello!

Many thanks to Louis-Rémi Babé, who submitted a patch to fix a regression with negative margin animations a mere 30 minutes before the release!

jQuery 1.7.2 Change Log

Here’s the change log of the 1.7.2 release.

Ajax

  • #4624: Charset in default ajaxSettings.contentType
  • #10978: jQuery.param() should allow non-native constructed objects as property values
  • #11264: evalScript() uses defaults set by ajaxSetup()
  • #11426: jQuery.ajax() always fails when requesting JPG images in IE

Attributes

  • #5571: Allow chaining when passing undefined to any setter in jQuery
  • #10828: attr(“coords”) returns undefined in IE7
  • #10870: Incorrect behaviour of $.removeAttr(“selected”)
  • #11316: Consider looking through valHooks by element type first, then by nodeName instead of the other way around

Build

  • #10692: Configure the jshint options to more accurately match the style guide
  • #10693: generalize the “test something in an iframe” code in unit tests
  • #10901: have unit tests fail if the tester is running from file:// or doesn’t have PHP
  • #10902: ability to test a built version of jQuery in unit tests
  • #10931: Unit tests shouldn’t require internet access

Core

  • #10466: jQuery.param() mistakes wrapped primitives for deep objects

Css

  • #10639: outerWidth(true) and css(‘margin’) returning % instead of px in Webkit
  • #10754: have jQuery.swap return the return of the callback instead of just executing it
  • #10782: Incorrect calculating width
  • #10796: Bug in IE7 with $(‘#el’).css.(‘background-position’)
  • #10858: css.js regular expressions are incomplete
  • #11119: The curCSS function only need 2 arguments

Data

  • #11309: hexadecimal-formatted data-* attributes parsed incorrectly

Deferred

  • #11306: calling .disable() or .lock() on a $.Callbacks object breaks its fired() status

Dimensions

  • #3838: $(document).height() incorrect in IE6

Effects

  • #8498: Animate Hooks
  • #10006: method show is not working as expected in all browsers when called for document fragment
  • #10848: Animation toggling loses state tracking in certain atomic edge cases
  • #11415: Silently ignore negative CSS values where they are illegal
  • #11469: Negative margin in animations (.animate)

Event

  • #8165: .live(‘click’, handler) fires on disabled buttons with child elements in Chrome
  • #10819: Eliminate “this.on.call(this, “
  • #10878: $(“select”).live(“change”, function(){ …broken in IE8 in jQuery 1.7
  • #10961: Error in XRegExp using jQuery 1.7.1 in IE6-9
  • #10970: The .on() selector parameter doesn’t work with :not(:first) selector
  • #10984: Cannot off() custom events ($.event.special)
  • #11021: Hover hack mangles a namespace named “hover”
  • #11076: .clone(true) loses delegation filters
  • #11130: jQuery.fn.on: binding map with null selector ignores data
  • #11145: $(document).on() not working with name=”disabled”

Manipulation

  • #9427: Passing undefined to .text() does not trigger setter
  • #10753: inline the evalScript function in manipulation.js as it’s only used once
  • #10864: text() method on a document fragment always returns the empty string
  • #11055: Update HTML5 Shim elements list to support latest html5shiv
  • #11217: Append problem with webkit
  • #11291: Cloning XMLDoc’s with HTML5 nodeName’s breaks on IE
  • #11323: script tags with type=”text/ecmascript” leak into the DOM
  • #11356: safeFragment memory leak

Misc

  • #10952: .fired() doesn’t work on Callbacks object when it is flagged with “once”
  • #11257: Wrong path to source files in test suite if PHP missing

Queue

  • #10967: .promise() does not attach methods onto target

Support

  • #7986: Bug in $.support.boxModel if page has DIV-element CSS
  • #11048: Support Tests affect layout for positioned elements in IE6-9
  • #11337: Bug in $.support.reliableMarginRight

Traversing

  • #11370: $(‘<div>’).siblings() throws exception

jQuery 1.7.2 RC1 Released

Posted on by

jQuery 1.7.2 will be arriving soon! To make sure that we’ve fixed the bugs voted “Most Likely to Annoy” without introducing any new bugs, we need your help in testing this release candidate. You can get the code from the jQuery CDN:

It will only take a few minutes to drop in this latest file and test it with your code. If you’ve got a lot of pages, the list of fixed bugs below may be a helpful guide for determining what to test. And of course, if you reported a bug or were affected by one listed below, please re-test to be sure we fixed it for good. We’ve tested it internally against the current builds of jQuery UI and jQuery Mobile. There is one compatibility issue with jQuery Mobile 1.1 RC1 that has already been fixed and will be addressed by their next release.

Looking for an even easier way to test your web site with the latest jQuery? On Windows you can use the excellent Fiddler tool and create an AutoResponder rule to point your HTTP script requests for jQuery to the file location above. Then you are testing your live web site with the latest jQuery on your PC, without having to edit any files at all! If you know of similar tools for other platforms, leave a message in the comments below.

If you are particularly interested in IE6 support, please help us out. We are having sporadic trouble running the unit tests in IE6. It hasn’t been possible for us to determine the cause of these problems, but the problem doesn’t happen consistently and the sheer size of our test suite may just be overwhelming a browser that is more than a decade old. If you observe any reproducible failures in real code, please let us know and try to provide the smallest possible test case.

You can use the bug tracker to report bugs; be sure to create a test case on jsFiddle so we can figure it out easily. If you’re not sure it’s a bug, ask on our forum or on StackOverflow. Please don’t use the blog comments below to report bugs.

jQuery 1.7.2rc1 Change Log

Here’s the current change log of the 1.7.2rc1 release.

Ajax

  • #4624: Charset in default ajaxSettings.contentType
  • #10978: jQuery.param() should allow non-native constructed objects as property values
  • #11264: evalScript() uses defaults set by ajaxSetup()
  • #11426: jQuery.ajax() always fails when requesting JPG images in IE

Attributes

  • #5571: Allow chaining when passing undefined to any setter in jQuery
  • #10828: attr(“coords”) returns undefined in IE7
  • #10870: Incorrect behaviour of $.removeAttr(“selected”)
  • #11316: Consider looking through valHooks by element type first, then by nodeName instead of the other way around

Build

  • #10692: Configure the jshint options to more accurately match the style guide
  • #10693: generalize the “test something in an iframe” code in unit tests
  • #10901: have unit tests fail if the tester is running from file:// or doesn’t have PHP
  • #10902: ability to test a built version of jQuery in unit tests
  • #10931: Unit tests shouldn’t require internet access

Core

  • #10466: jQuery.param() mistakes wrapped primitives for deep objects

Css

  • #10639: outerWidth(true) and css(‘margin’) returning % instead of px in Webkit
  • #10754: have jQuery.swap return the return of the callback instead of just executing it
  • #10782: Incorrect calculating width
  • #10796: Bug in IE7 with $(‘#el’).css.(‘background-position’)
  • #10858: css.js regular expressions are incomplete
  • #11119: The curCSS function only need 2 arguments

Data

  • #11309: hexadecimal-formatted data-* attributes parsed incorrectly

Deferred

  • #11306: calling .disable() or .lock() on a $.Callbacks object breaks its fired() status

Dimensions

  • #3838: $(document).height() incorrect in IE6

Effects

  • #8498: Animate Hooks
  • #10006: method show is not working as expected in all browsers when called for document fragment
  • #10848: Animation toggling loses state tracking in certain atomic edge cases
  • #11415: Silently ignore negative CSS values where they are illegal

Event

  • #8165: .live(‘click’, handler) fires on disabled buttons with child elements in Chrome
  • #10819: Eliminate “this.on.call(this, “
  • #10878: $(“select”).live(“change”, function(){ …broken in IE8 in jQuery 1.7
  • #10961: Error in XRegExp using jQuery 1.7.1 in IE6-9
  • #10970: The .on() selector parameter doesn’t work with :not(:first) selector
  • #10984: Cannot off() custom events ($.event.special)
  • #11021: Hover hack mangles a namespace named “hover”
  • #11076: .clone(true) loses delegation filters
  • #11130: jQuery.fn.on: binding map with null selector ignores data
  • #11145: $(document).on() not working with name=”disabled”

Manipulation

  • #9427: Passing undefined to .text() does not trigger setter
  • #10753: inline the evalScript function in manipulation.js as it’s only used once
  • #10864: text() method on a document fragment always returns the empty string
  • #11055: Update HTML5 Shim elements list to support latest html5shiv
  • #11217: Append problem with webkit
  • #11291: Cloning XMLDoc’s with HTML5 nodeName’s breaks on IE
  • #11323: script tags with type=”text/ecmascript” leak into the DOM
  • #11356: safeFragment memory leak

Misc

  • #10952: .fired() doesn’t work on Callbacks object when it is flagged with “once”
  • #11257: Wrong path to source files in test suite if PHP missing

Queue

  • #10967: .promise() does not attach methods onto target

Support

  • #7986: Bug in $.support.boxModel if page has DIV-element CSS
  • #11048: Support Tests affect layout for positioned elements in IE6-9
  • #11337: Bug in $.support.reliableMarginRight

Traversing

  • #11370: $(‘<div>’).siblings() throws exception

jQuery 1.7.2 Beta 1 Released

Posted on by

Hey there Internets, it’s the jQuery Core team! We haven’t talked in a while, but over the holidays we were busy fixing the bugs you reported. The result of that hard work is jQuery 1.7.2 Beta 1. We decided to get a beta out by Groundhog Day so you wouldn’t be in the shadow of six more weeks of unfixed bugs.

You can get the code from the jQuery CDN:

Oh, we know what you’re thinking: “Cool, a new version of jQuery; I’ll wait until the final release has been out a few weeks and then I’ll give it a try.” Right, and then you’ll find some bug that keeps you from upgrading. Nothing makes us sadder than finishing up a release and only then seeing a report of a serious bug that could have been fixed earlier.

So please, come out of your burrow and try this beta with your code. Did we miss an old bug? Did we create a new bug that makes you feel like Bill Murray waking up to “I Got You Babe?” We want to know. You can use the bug tracker to report bugs; be sure to create a test case on jsFiddle so we can figure it out easily. If you’re not sure it’s a bug, ask on our forum or on StackOverflow.

jQuery 1.7.2b1 Change Log

The current change log of the 1.7.2b1 release.

Ajax

  • #10978: jQuery.param() should allow non-native constructed objects as property values

Attributes

  • #5571: Allow chaining when passing undefined to any setter in jQuery

Build

  • #10692: Configure the jshint options to more accurately match the style guide
  • #10902: ability to test a built version of jQuery in unit tests
  • #10931: Unit tests shouldn’t require internet access

Core

  • #10466: jQuery.param() mistakes wrapped primitives for deep objects

Css

  • #10639: outerWidth(true) and css(‘margin’) returning % instead of px in Webkit
  • #10754: have jQuery.swap return the return of the callback instead of just executing it
  • #10782: Incorrect calculating width
  • #10796: Bug in IE7 with $(‘#el’).css.(‘background-position’)
  • #10858: css.js regular expressions are incomplete
  • #11119: The curCSS function only need 2 arguments

Effects

  • #8498: Animate Hooks
  • #10006: method show is not working as expected in all browsers when called for document fragment
  • #10848: Animation toggling loses state tracking in certain atomic edge cases

Event

  • #8165: .live(‘click’, handler) fires on disabled buttons with child elements in Chrome
  • #10819: Eliminate “this.on.call(this, “
  • #10878: $(“select”).live(“change”, function(){ …broken in IE8 in jQuery 1.7
  • #10961: Error in XRegExp using jQuery 1.7.1 in IE6-9
  • #10970: The .on() selector parameter doesn’t work with :not(:first) selector
  • #10984: Cannot off() custom events ($.event.special)
  • #11021: Hover hack mangles a namespace named “hover”
  • #11076: .clone(true) loses delegation filters
  • #11130: jQuery.fn.on: binding map with null selector ignores data
  • #11145: $(document).on() not working with name=”disabled”

Manipulation

  • #9427: Passing undefined to .text() does not trigger setter
  • #10753: inline the evalScript function in manipulation.js as it’s only used once
  • #10864: text() method on a document fragment always returns the empty string
  • #11055: Update HTML5 Shim elements list to support latest html5shiv

Misc

  • #10952: .fired() doesn’t work on Callbacks object when it is flagged with “once”
  • #11257: Wrong path to source files in test suite if PHP missing

Support

  • #11048: Support Tests affect layout for positioned elements in IE6-9

Call for jQuery 1.8 Ideas

Posted on by

We’re ready for our next round of community input, this time for version 1.8! This is your chance to suggest things we can fix, add, change, or remove in jQuery to make it better.

You can add a suggestion using this form; whenever possible provide links to a bug report, a page with a detailed description, or implementations that represent your idea. We’d like to have all your input by December 5 so we can read and discuss them before setting the 1.8 roadmap.

Many thanks for the suggestions left on our earlier blog post about how we can improve jQuery by trimming it down. We’ve gone through those comments and have a few thoughts about how we can address some of them in future versions.

Create a configurable download builder

Several people wondered why we don’t have a way to build a file with just the parts of jQuery you need, since jQuery UI, for example, has that option. It’s not quite the same situation. You know if you are using, say UI Accordion because you call it directly. You often do not know if you or some plugin you include on your page is using $.fn.prepend() or $.fn.animate(). Whether you are using them may even depend on parameters you pass to plugins at runtime.

To keep jQuery development manageable and ensure that CDNs can offer a single file that everyone on the Internet can share and cache effectively, the team wants to stay with a single file as its primary offering. Creating a configurable download may improve file size marginally, but it also complicates documentation, plugin use, and debugging. That is a lot more work for both you and us.

We’re already beginning the efforts to improve modularity by eliminating unwanted dependencies inside jQuery; many of the deprecated features we announce will be directed towards removing those dependencies. By laying that groundwork, others who want to create their own smaller subsets of jQuery or modular versions should have a much easier job.

However, we believe we can do even better than that, and would like to offer automated ways for any user to create an optimally minimized file that includes both application code and just the needed parts of jQuery. In particular, we are working with the Google Closure Compiler team to see if we could use its ADVANCED_OPTIMIZATIONS option. We’ll have more information on our progress as it develops.

Wait until version 2.0 before removing things

We’re sensitive to breaking all the existing jQuery code out there. That is why we are deprecating things as early as possible, so that people have plenty of time to change their code. Just because we deprecate something today, it does not necessarily mean we’ll remove it in the next version. We believe the list of things actually being removed in 1.8 are minor and unlikely to affect most users.

If our experiments with Closure Compiler pan out, we may even be able to leave in many deprecated features but they will be automatically removed if you don’t use them and build a custom application file that includes jQuery. That would be the best of both worlds.

Remove IE 6, 7, and/or 8 support

This topic comes up constantly, so let’s try to put it to bed once and for all. People tend to greatly overestimate the amount of code in jQuery that is specifically related to IE. Most of the problems in IE 6 and IE 7 are also present in IE 8, so there is no real size or complexity benefit to dropping support for the first two as long as that last one still has appreciable desktop market share and must be supported. Nobody (including Microsoft itself) likes these Jurassic Park browsers, but stripping out support for them right now would break web sites for many users.

That said, we know that older-IE support is not required in some scenarios such as mobile browsers. We are looking into ways to put as much of that code as possible into a single clearly marked block so that it can be easily removed by someone who is willing to create their own custom jQuery version. It may also be possible to get Closure Compiler’s help with this issue as well. However, we are not sure that will even provide a significant space savings in gzipped file size, and it won’t offer a performance boost since those code paths aren’t taken in other browsers.

Remove jQuery.browser

We have documented for nearly two years that we intend to move jQuery.browser into a plugin, and several people suggested it in the comments as well. Browser sniffing is not a reliable way to look for features, we recommend something like Modernizr instead. The regular expressions used for browser sniffing are large and don’t compress well; moving it to a plugin will ensure that only the people who use it must pay that size penalty.

What about your ideas?

Please do take this opportunity to give us your input. The team is looking forward to reviewing your suggestions. Oh, and don’t forget to try jQuery 1.7.1 soon!

jQuery 1.7.1 Released

Posted on by

Here in the United States, we’re celebrating Thanksgiving this week. For those of you living elsewhere in the world, it’s a time when we install and test new versions of Javascript libraries while feasting on Mom’s homemade goodies. Kind of like a code sprint, but with better food. We invite everyone worldwide to join us in these traditions.

To kick off the festivities, the jQuery Team is quite thankful to be releasing version 1.7.1! In this go-round we made Pilgrim’s progress on a cornucopia of bugs, listed below. We are serving up our delicious copies on the jQuery CDN, fresh and warm from the oven:

These latest files should also be up on the major CDNs shortly, but please be patient since this is a holiday week for them as well.

Please install and test this latest slice of jQuery with your code. We hope you’ll find it tasty. If we forgot to fry some turkey of a bug, we want to hear about it. Just put together a specific test case for the problems you’ve found (we love jsFiddle.net for that) and create a bug report at bugs.jquery.com.

Also, please welcome new jQuery Core team member Mike Sherov! We’re thankful to have his help for all the great things we have planned for upcoming versions. Mike has a full-time job at SNAP Interactive in New York City, but contributes to the project in his spare time. Please Be Like Mike and pitch in to help the project any way you can. It doesn’t have to be coding. We can always use help in answering questions on the forum or just reproducing and identifying the source of obscure bugs reported on the bug tracker. See our Getting Involved page for information.

We’ll be opening the call for 1.8 suggestions in just a day or two. Take a look at the 1.7.1 release and think about what kind of awesome sauce we can put on top of it for the next big one!

jQuery 1.7.1 Change Log

The change log of the 1.7.1 release.

Ajax

  • #10723: jqXHR.always() returns a Promise instead of a jqXHR object

Attributes

  • #10724: $(document).text() always returns an empty string
  • #10773: removeAttr is fragile for edge cases

Build

  • #10630: Fix focus-related test failures to resolve Swarm failures

Core

  • #10616: Type coersion not done for -1 in .eq
  • #10646: Have jQuery.error throw instanceof Error object
  • #10682: Creating DOM elements with $(‘ ‘) leaks memory and skips the fragment cache
  • #10687: jQuery calls the AMD define() global function too early
  • #10690: isNumeric

Css

  • #10733: remove uses of jQuery.each in css module in favor of a for loop

Data

  • #10675: Use internalKey shortcut instead of jQuery.expando

Effects

  • #10669: .animate() no longer animates percentage(%) width
  • #10750: A “null” in the data object can cause an error in stop

Event

  • #10676: wheelDelta not added to mousewheel event anymore
  • #10701: Problems with submit forms using submit function
  • #10704: special.handle method should fire under origType name
  • #10705: off bug event name parser
  • #10712: Triggering blur with live bind broken
  • #10717: A triggered load bubbles up to window
  • #10791: Delegated Events fail on SVG elements
  • #10794: .triggerHandler should not .preventDefault()
  • #10798: live(“submit”) and .submit() would cause unobtrusive ajax live to fire twice
  • #10844: .delegate() on submit doesn’t work when form contains input with name “id”

Manipulation

  • #10177: index of callback function in .wrap is always 0
  • #10667: HTML5 Support in .wrapAll() does add a “:” to element
  • #10670: rnoshimcache probably not constructed correctly
  • #10812: passing empty object to .before() or .after() throws exception in IE7

Misc

  • #10691: remove all occurrences of the “equals” and “same” function in the unit tests`

Support

  • #10629: IE is much too sensitive concerning the fake body. Explore cleaning up support.js to avoid any future crashes.
  • #10807: Non-ascii apostrophe in comment

jQuery 1.7.1 RC1 Released

Posted on by

Just to let you know we’re not asleep at the switch around jQuery Central, we’ve got a new preview release of jQuery. It fixes the problems reported by the community since the original 1.7 release. Please test the code in your applications, making sure that there are no major problems. If you tried jQuery 1.7 and reported a bug, it should be fixed in this release.

You can get the code from the jQuery CDN:

You can help us by dropping that code into your existing application and letting us know that if anything no longer works. Please file a bug and be sure to mention that you’re testing against jQuery 1.7.1 RC1.

We want to encourage everyone from the community to try and get involved in contributing back to jQuery core. We’ve set up a full page of information dedicated towards becoming more involved with the team. The team is here and ready to help you help us!

jQuery 1.7.1 RC1 Change Log

The current change log of the 1.7.1 RC1 release.

Ajax

  • #10723: jqXHR.always() returns a Promise instead of a jqXHR object

Attributes

  • #10724: $(document).text() always returns an empty string
  • #10773: removeAttr is fragile for edge cases

Build

  • #10630: Fix focus-related test failures to resolve Swarm failures

Core

  • #10616: Type coersion not done for -1 in .eq
  • #10646: Have jQuery.error throw instanceof Error object
  • #10682: Creating DOM elements with $(‘ ‘) leaks memory and skips the fragment cache
  • #10687: jQuery calls the AMD define() global function too early
  • #10690: isNumeric

Css

  • #10733: remove uses of jQuery.each in css module in favor of a for loop

Data

  • #10675: Use internalKey shortcut instead of jQuery.expando

Effects

  • #10669: .animate() no longer animates percentage(%) width
  • #10750: A “null” in the data object can cause an error in stop

Event

  • #10676: wheelDelta not added to mousewheel event anymore
  • #10701: Problems with submit forms using submit function
  • #10704: special.handle method should fire under origType name
  • #10705: off bug event name parser
  • #10712: Triggering blur with live bind broken
  • #10717: A triggered load bubbles up to window
  • #10791: Delegated Events fail on SVG elements
  • #10794: .triggerHandler should not .preventDefault()
  • #10798: live(“submit”) and .submit() would cause unobtrusive ajax live to fire twice

Manipulation

  • #10177: index of callback function in .wrap is always 0
  • #10667: HTML5 Support in .wrapAll() does add a “:” to element
  • #10670: rnoshimcache probably not constructed correctly
  • #10812: passing empty object to .before() or .after() throws exception in IE7

Misc

  • #10691: remove all occurrences of the “equals” and “same” function in the unit tests`

Support

  • #10629: IE is much too sensitive concerning the fake body. Explore cleaning up support.js to avoid any future crashes

Building a Slimmer jQuery

Posted on by

jQuery is more than five years old now! Over that time it has evolved along with the browsers, web sites, devices, developers, and users that it serves. It has also, um, grown quite a bit over that time. jQuery has added a lot of useful features, but it’s also accumulated cruft that we’d prefer not to support into perpetuity. It may not be an issue on a desktop PC with a high-speed connection, but we want jQuery to be a good solution for mobile devices as well.

Along with our continuing push for higher performance, our priority for upcoming versions is a smaller gzipped file size. It’s hard to do that when every new feature or bug fix must also preserve all existing features and behavior. So today, we want to start a conversation about slimming down the jQuery API by deprecating some features. Here are our guidelines for deprecation:

  • We don’t believe the feature represents current best practice in the use of jQuery.
  • The feature has proven unpopular, confusing, inefficient, or ineffective in actual use.
  • It is not practical or feasible to enhance the feature or address its limitations.
  • Removing it at some future time could yield notable usability, size, or performance benefits.

Deprecation is just the first step in a process that you can participate in. It is our goal to:

  • Explain the reasons for deprecating a particular feature, as described above.
  • Give at least one major-point-version, and often more, between deprecation and removal.
  • Provide alternatives to deprecated features so that migration is not painful.
  • Listen to community feedback regarding deprecation and removal.

Occasionally, as in the situation with event.layerX/layerY in version 1.7, we will make a breaking change with shorter notice if we judge that it will cause less pain to remove the feature immediately than to leave it in. Those will hopefully be rare exceptions.

Version 1.7 Deprecations

With those things in mind, we consider the following features to be deprecated as of version 1.7. Existing code that uses them continues to work, but the recommended alternatives are a better choice for compatibility with future versions.

.live() and .die(): We continue to get many bug reports and see user confusion regarding the quirks of the .live() method. Common issues are now documented on its updated API page. We strongly advise the use of .on() or .delegate() for new code, since they are better APIs. Given its widespread use it’s unlikely we will remove this API in 1.8, but please do update your code as soon as possible.

Non-standard event properties: As part of our push to improve event handler performance, we are also deprecating the copying of several event properties from the native event object to the jQuery event object and will remove them in 1.8: attrChange, attrName, relatedNode, and srcElement. Instead of accessing these through event.NAME you can access them via event.originalEvent.NAME where needed.

$.ajax() Deferred aliases: In version 1.5 we defined .error()/,success()/.complete() on the jqXHR object as aliases for the Deferred’s .fail()/.done()/.always() methods. Although that seemed like a good idea at the time, it makes jqXHR a non-standard Deferred. That’s not good. Whenever possible, use the deferred/promise method name in preference to the jqXHR one. We still have some work to do here to provide a full migration path, so we are likely to continue supporting the aliases past 1.8.

deferred.isResolved() and deferred.isRejected(): Now that Deferreds and Promises have progress notifications and a convenient .state() method, we are deprecating these older methods and will remove them in 1.8. Getting the state of an N-state object using N-1 Boolean methods is a cruel-code version of “Twenty Questions”. Deferred-based code rarely needs to inspect state, and the string returned now is more convenient for a debugging scenario where it’s often used.

.attr(“value”) on inputs: For backwards compatibility, we’ve been returning the current value here (as in “what is currently in the input box”) versus the real attribute (what the value attribute says in the HTML). That leaves us no way to provide the true attribute value, and is confusing since W3C selectors work on the attribute and not the current value. So we are deprecating this behavior and will remove it in 1.8. Always use the .val() method to get the current live value of an input element. Until we can reclaim the attribute, you can use $("selector")[0].getAttribute("value") except on IE 6/7 where that will still return the current value. (Our 1.8 solution will get the attribute value on all browsers and is another reason why we’re anxious to change this.)

.closest(Array) returning Array: This signature is a bit of a strange bird, it was created for use by the old live events code but it returns an Array rather than a jQuery object. As of 1.8 we plan to remove it. The other signatures of .closest() are here to stay and are not affected.

.data(“events”): jQuery stores its event-related data in a data object named (wait for it) events on each element. This is an internal data structure so in 1.8 this will be removed from the user data name space so it won’t conflict with items of the same name. jQuery’s event data can still be accessed via jQuery._data(element, "events") but be aware that this is an internal data structure that is undocumented and should not be modified.

$.sub() as a plugin: Although $.sub() can be useful for creating interference-free zones for plugins, it is not used by jQuery core and not widely used by other code, so we intend to transition it to a plugin in version 1.8 to save space.

Looking Towards jQuery 1.8

Given our push for a svelte jQuery, the filter for new features in 1.8 will be stringent. Even performance-related proposals need to be balanced against the space they use or save. Features that can be implemented via plugins, special events, attribute hooks, or other jQuery extension mechanisms are likely to stay outside core for now.

That brings up the question of what we could deprecate in 1.8 and eventually remove to simplify and streamline the library. Those things don’t have to totally disappear; they could move into a separate plugin, for example, and only be included when needed. Take a look at how you use jQuery, and talk about it with your colleagues.

Within a few weeks, we’ll be opening the call for your ideas concerning jQuery 1.8 with another blog post — so start thinking about it now!

Edit: No, we’re not removing IE6 support yet, and we can’t. As John Resig mentions at every jQuery Conference, most of the sins of IE6 are also visited upon IE7 and IE8, which together still have more than one-third of desktop browser market share. It doesn’t make sense to remove support for IE6 until we can whack IE7 and IE8 as well.