Fix for a selector speed regression (calling a simple selector many times resulted...
authorJohn Resig <jeresig@gmail.com>
Tue, 21 Aug 2007 05:43:44 +0000 (05:43 +0000)
committerJohn Resig <jeresig@gmail.com>
Tue, 21 Aug 2007 05:43:44 +0000 (05:43 +0000)
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
src/intro.js
src/jquery/jquery.js
src/outro.js
src/selector/selector.js

index cbad528..23dbd6f 100644 (file)
@@ -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 );
-       
-};
index 9204081..2e64f66 100644 (file)
@@ -1,2 +1,2 @@
 // prevent execution of jQuery if included more than once
-if(typeof window.jQuery == "undefined") {
+if(typeof window.jQuery == "undefined") (function(){
index 1d2e197..8089e4e 100644 (file)
@@ -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
index 5c34318..0319a0f 100644 (file)
@@ -1 +1 @@
-}
+})();
index 34aaf61..f2c224a 100644 (file)
@@ -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);
                                        }