Fix for a selector speed regression (calling a simple selector many times resulted in a significant speed down). This has been fixed by breaking the RegExps out into the global scope. This required that a closure be implemented around the full jQuery script (which is now the case). Some simple changes were made in addition to the RegExp one, allowing for some greater flexibility on our part - and hopefully better compression.
Speed results: http://dev.jquery.com/~john/ticket/1351/ vs. http://dev.jquery.com/~john/ticket/1351/113.html vs. http://dev.jquery.com/~john/ticket/1351/112.html
This commit is contained in:
parent
8c15e852a4
commit
b6d920cf05
5 changed files with 39 additions and 38 deletions
|
@ -578,8 +578,6 @@ jQuery.extend({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
new function(){
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bind a function to the scroll event of each matched element.
|
* Bind a function to the scroll event of each matched element.
|
||||||
*
|
*
|
||||||
|
@ -976,5 +974,3 @@ new function(){
|
||||||
|
|
||||||
// A fallback to window.onload, that will always work
|
// A fallback to window.onload, that will always work
|
||||||
jQuery.event.add( window, "load", jQuery.ready );
|
jQuery.event.add( window, "load", jQuery.ready );
|
||||||
|
|
||||||
};
|
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
// prevent execution of jQuery if included more than once
|
// prevent execution of jQuery if included more than once
|
||||||
if(typeof window.jQuery == "undefined") {
|
if(typeof window.jQuery == "undefined") (function(){
|
||||||
|
|
48
src/jquery/jquery.js
vendored
48
src/jquery/jquery.js
vendored
|
@ -9,9 +9,6 @@
|
||||||
* $Rev$
|
* $Rev$
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Global undefined variable
|
|
||||||
window.undefined = window.undefined;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new jQuery Object
|
* Create a new jQuery Object
|
||||||
*
|
*
|
||||||
|
@ -22,7 +19,7 @@ window.undefined = window.undefined;
|
||||||
* @param jQuery|Element|Array<Element> c context
|
* @param jQuery|Element|Array<Element> c context
|
||||||
* @cat Core
|
* @cat Core
|
||||||
*/
|
*/
|
||||||
var jQuery = function(a,c) {
|
window.jQuery = function(a,c) {
|
||||||
// If the context is global, return a new object
|
// If the context is global, return a new object
|
||||||
if ( window == this || !this.init )
|
if ( window == this || !this.init )
|
||||||
return new jQuery(a,c);
|
return new jQuery(a,c);
|
||||||
|
@ -35,7 +32,7 @@ if ( typeof $ != "undefined" )
|
||||||
jQuery._$ = $;
|
jQuery._$ = $;
|
||||||
|
|
||||||
// Map the jQuery namespace to the '$' one
|
// Map the jQuery namespace to the '$' one
|
||||||
var $ = jQuery;
|
window.$ = jQuery;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function accepts a string containing a CSS or
|
* This function accepts a string containing a CSS or
|
||||||
|
@ -1527,7 +1524,7 @@ jQuery.extend({
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prop.match(/float/i))
|
if (prop.match(/float/i))
|
||||||
prop = jQuery.styleFloat;
|
prop = styleFloat;
|
||||||
|
|
||||||
if (!force && elem.style[prop])
|
if (!force && elem.style[prop])
|
||||||
ret = elem.style[prop];
|
ret = elem.style[prop];
|
||||||
|
@ -1940,29 +1937,31 @@ jQuery.extend({
|
||||||
* @type Boolean
|
* @type Boolean
|
||||||
* @cat JavaScript
|
* @cat JavaScript
|
||||||
*/
|
*/
|
||||||
new function() {
|
var userAgent = navigator.userAgent.toLowerCase();
|
||||||
var b = navigator.userAgent.toLowerCase();
|
|
||||||
|
|
||||||
// Figure out what browser is being used
|
// Figure out what browser is being used
|
||||||
jQuery.browser = {
|
jQuery.browser = {
|
||||||
version: (b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
|
version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
|
||||||
safari: /webkit/.test(b),
|
safari: /webkit/.test(userAgent),
|
||||||
opera: /opera/.test(b),
|
opera: /opera/.test(userAgent),
|
||||||
msie: /msie/.test(b) && !/opera/.test(b),
|
msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
|
||||||
mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
|
mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";
|
||||||
|
|
||||||
|
jQuery.extend({
|
||||||
// Check to see if the W3C box model is being used
|
// Check to see if the W3C box model is being used
|
||||||
jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
|
boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
|
||||||
|
|
||||||
jQuery.styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";
|
styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
|
||||||
|
|
||||||
jQuery.props = {
|
props: {
|
||||||
"for": "htmlFor",
|
"for": "htmlFor",
|
||||||
"class": "className",
|
"class": "className",
|
||||||
"float": jQuery.styleFloat,
|
"float": styleFloat,
|
||||||
cssFloat: jQuery.styleFloat,
|
cssFloat: styleFloat,
|
||||||
styleFloat: jQuery.styleFloat,
|
styleFloat: styleFloat,
|
||||||
innerHTML: "innerHTML",
|
innerHTML: "innerHTML",
|
||||||
className: "className",
|
className: "className",
|
||||||
value: "value",
|
value: "value",
|
||||||
|
@ -1971,9 +1970,8 @@ new function() {
|
||||||
readonly: "readOnly",
|
readonly: "readOnly",
|
||||||
selected: "selected",
|
selected: "selected",
|
||||||
maxlength: "maxLength"
|
maxlength: "maxLength"
|
||||||
};
|
}
|
||||||
|
});
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a set of elements containing the unique parents of the matched
|
* Get a set of elements containing the unique parents of the matched
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
}
|
})();
|
||||||
|
|
|
@ -1,3 +1,11 @@
|
||||||
|
|
||||||
|
var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
|
||||||
|
"(?:[\\w*_-]|\\\\.)" :
|
||||||
|
"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
|
||||||
|
quickChild = new RegExp("^[/>]\\s*(" + chars + "+)"),
|
||||||
|
quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
|
||||||
|
quickClass = new RegExp("^([#.]?)(" + chars + "*)");
|
||||||
|
|
||||||
jQuery.extend({
|
jQuery.extend({
|
||||||
expr: {
|
expr: {
|
||||||
"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
|
"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
|
||||||
|
@ -62,8 +70,7 @@ jQuery.extend({
|
||||||
/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
|
/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
|
||||||
|
|
||||||
// Match: :even, :last-chlid, #id, .class
|
// Match: :even, :last-chlid, #id, .class
|
||||||
new RegExp("^([:.#]*)(" +
|
new RegExp("^([:.#]*)(" + chars + "+)")
|
||||||
( jQuery.chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? "(?:[\\w*_-]|\\\\.)" : "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)" ) + "+)")
|
|
||||||
],
|
],
|
||||||
|
|
||||||
multiFilter: function( expr, elems, not ) {
|
multiFilter: function( expr, elems, not ) {
|
||||||
|
@ -125,7 +132,7 @@ jQuery.extend({
|
||||||
|
|
||||||
// An attempt at speeding up child selectors that
|
// An attempt at speeding up child selectors that
|
||||||
// point to a specific element tag
|
// point to a specific element tag
|
||||||
var re = new RegExp("^[/>]\\s*(" + jQuery.chars + "+)");
|
var re = quickChild;
|
||||||
var m = re.exec(t);
|
var m = re.exec(t);
|
||||||
|
|
||||||
if ( m ) {
|
if ( m ) {
|
||||||
|
@ -194,7 +201,7 @@ jQuery.extend({
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Optimize for the case nodeName#idName
|
// Optimize for the case nodeName#idName
|
||||||
var re2 = new RegExp("^(" + jQuery.chars + "+)(#)(" + jQuery.chars + "+)");
|
var re2 = quickID;
|
||||||
var m = re2.exec(t);
|
var m = re2.exec(t);
|
||||||
|
|
||||||
// Re-organize the results, so that they're consistent
|
// Re-organize the results, so that they're consistent
|
||||||
|
@ -204,7 +211,7 @@ jQuery.extend({
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, do a traditional filter check for
|
// Otherwise, do a traditional filter check for
|
||||||
// ID, class, and element selectors
|
// ID, class, and element selectors
|
||||||
re2 = new RegExp("^([#.]?)(" + jQuery.chars + "*)");
|
re2 = quickClass;
|
||||||
m = re2.exec(t);
|
m = re2.exec(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue