Skip to content
Permalink
Browse files
Fix for a selector speed regression (calling a simple selector many t…
…imes 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
  • Loading branch information
jeresig committed Aug 21, 2007
1 parent 8c15e85 commit b6d920cf05fae3dcfe515166013ce39411ac5e16
Showing with 40 additions and 39 deletions.
  1. +0 −4 src/event/event.js
  2. +1 −1 src/intro.js
  3. +26 −28 src/jquery/jquery.js
  4. +1 −1 src/outro.js
  5. +12 −5 src/selector/selector.js
@@ -578,8 +578,6 @@ jQuery.extend({
}
});

new function(){

/**
* 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
jQuery.event.add( window, "load", jQuery.ready );

};
@@ -1,2 +1,2 @@
// prevent execution of jQuery if included more than once
if(typeof window.jQuery == "undefined") {
if(typeof window.jQuery == "undefined") (function(){
@@ -9,9 +9,6 @@
* $Rev$
*/

// Global undefined variable
window.undefined = window.undefined;

/**
* Create a new jQuery Object
*
@@ -22,7 +19,7 @@ window.undefined = window.undefined;
* @param jQuery|Element|Array<Element> c context
* @cat Core
*/
var jQuery = function(a,c) {
window.jQuery = function(a,c) {
// If the context is global, return a new object
if ( window == this || !this.init )
return new jQuery(a,c);
@@ -35,7 +32,7 @@ if ( typeof $ != "undefined" )
jQuery._$ = $;

// Map the jQuery namespace to the '$' one
var $ = jQuery;
window.$ = jQuery;

/**
* This function accepts a string containing a CSS or
@@ -1527,7 +1524,7 @@ jQuery.extend({
}

if (prop.match(/float/i))
prop = jQuery.styleFloat;
prop = styleFloat;

if (!force && elem.style[prop])
ret = elem.style[prop];
@@ -1940,29 +1937,31 @@ jQuery.extend({
* @type Boolean
* @cat JavaScript
*/
new function() {
var b = navigator.userAgent.toLowerCase();

// Figure out what browser is being used
jQuery.browser = {
version: (b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
safari: /webkit/.test(b),
opera: /opera/.test(b),
msie: /msie/.test(b) && !/opera/.test(b),
mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
};
var userAgent = navigator.userAgent.toLowerCase();

// Figure out what browser is being used
jQuery.browser = {
version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
safari: /webkit/.test(userAgent),
opera: /opera/.test(userAgent),
msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
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
jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";

jQuery.styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";

jQuery.props = {
boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
props: {
"for": "htmlFor",
"class": "className",
"float": jQuery.styleFloat,
cssFloat: jQuery.styleFloat,
styleFloat: jQuery.styleFloat,
"float": styleFloat,
cssFloat: styleFloat,
styleFloat: styleFloat,
innerHTML: "innerHTML",
className: "className",
value: "value",
@@ -1971,9 +1970,8 @@ new function() {
readonly: "readOnly",
selected: "selected",
maxlength: "maxLength"
};

};
}
});

/**
* 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({
expr: {
"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
@@ -62,8 +70,7 @@ jQuery.extend({
/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,

// Match: :even, :last-chlid, #id, .class
new RegExp("^([:.#]*)(" +
( jQuery.chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? "(?:[\\w*_-]|\\\\.)" : "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)" ) + "+)")
new RegExp("^([:.#]*)(" + chars + "+)")
],

multiFilter: function( expr, elems, not ) {
@@ -125,7 +132,7 @@ jQuery.extend({

// An attempt at speeding up child selectors that
// point to a specific element tag
var re = new RegExp("^[/>]\\s*(" + jQuery.chars + "+)");
var re = quickChild;
var m = re.exec(t);

if ( m ) {
@@ -194,7 +201,7 @@ jQuery.extend({

} else {
// Optimize for the case nodeName#idName
var re2 = new RegExp("^(" + jQuery.chars + "+)(#)(" + jQuery.chars + "+)");
var re2 = quickID;
var m = re2.exec(t);

// Re-organize the results, so that they're consistent
@@ -204,7 +211,7 @@ jQuery.extend({
} else {
// Otherwise, do a traditional filter check for
// ID, class, and element selectors
re2 = new RegExp("^([#.]?)(" + jQuery.chars + "*)");
re2 = quickClass;
m = re2.exec(t);
}

0 comments on commit b6d920c

Please sign in to comment.