From b6d920cf05fae3dcfe515166013ce39411ac5e16 Mon Sep 17 00:00:00 2001 From: John Resig Date: Tue, 21 Aug 2007 05:43:44 +0000 Subject: [PATCH] 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 --- src/event/event.js | 4 ---- src/intro.js | 2 +- src/jquery/jquery.js | 54 ++++++++++++++++++++++------------------------ src/outro.js | 2 +- src/selector/selector.js | 17 ++++++++++----- 5 files changed, 40 insertions(+), 39 deletions(-) diff --git a/src/event/event.js b/src/event/event.js index cbad528..23dbd6f 100644 --- a/src/event/event.js +++ b/src/event/event.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 ); - -}; diff --git a/src/intro.js b/src/intro.js index 9204081..2e64f66 100644 --- a/src/intro.js +++ b/src/intro.js @@ -1,2 +1,2 @@ // prevent execution of jQuery if included more than once -if(typeof window.jQuery == "undefined") { +if(typeof window.jQuery == "undefined") (function(){ diff --git a/src/jquery/jquery.js b/src/jquery/jquery.js index 1d2e197..8089e4e 100644 --- a/src/jquery/jquery.js +++ b/src/jquery/jquery.js @@ -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 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 diff --git a/src/outro.js b/src/outro.js index 5c34318..0319a0f 100644 --- a/src/outro.js +++ b/src/outro.js @@ -1 +1 @@ -} +})(); diff --git a/src/selector/selector.js b/src/selector/selector.js index 34aaf61..f2c224a 100644 --- a/src/selector/selector.js +++ b/src/selector/selector.js @@ -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); } -- 1.7.10.4