]> source.dussan.org Git - jquery.git/commitdiff
Clean up the quick selector expression parsing code.
authorDave Methvin <dave.methvin@gmail.com>
Sun, 14 Aug 2011 19:52:57 +0000 (15:52 -0400)
committertimmywil <timmywillisn@gmail.com>
Mon, 19 Sep 2011 19:42:31 +0000 (15:42 -0400)
src/event.js

index ba9ef6be42c4cee6ff7d99ebfdc86c1e5b953d04..44db42e33b0fb9a3e622e863c6ac3ab8ecaf14f9 100644 (file)
@@ -7,12 +7,32 @@ var rnamespaces = /\.(.*)$/,
        rescape = /[^\w\s.|`]/g,
        rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
        rhoverHack =  /\bhover(\.\S+)?/,
-       rquickIs = /^([\w\-]+)?(?:#([\w\-]+))?(?:\.([\w\-]+))?(?:\[([\w+\-]+)=["']?([\w\-]*)["']?\])?(:first-child|:last-child|:empty)?$/,
+       rquickIs = /^([\w\-]+)?(?:#([\w\-]+))?(?:\.([\w\-]+))?(?:\[([\w+\-]+)=["']?([\w\-]*)["']?\])?(?::(first-child|last-child|empty))?$/,
        quickPseudoMap = {
-               ":empty": "firstChild",
-               ":first-child": "previousSibling",
-               ":last-child": "nextSibling"
-       };
+               "empty": "firstChild",
+               "first-child": "previousSibling",
+               "last-child": "nextSibling"
+       },
+       quickParse = function( selector ) {
+               var quick = rquickIs.exec( selector );
+               if ( quick ) {
+                       //   0  1    2   3      4         5          6
+                       // [ _, tag, id, class, attrName, attrValue, pseudo(:empty :first-child :last-child) ]
+                       quick[1] = ( quick[1] || "" ).toLowerCase();
+                       quick[3] = quick[3] && new RegExp( "\\b" + quick[3] + "\\b" );
+                       quick[6] = quickPseudoMap[ quick[6] ];
+               }
+               return quick;
+       },
+       quickIs = function( elem, m ) {
+               return (
+                       (!m[1] || elem.nodeName.toLowerCase() === m[1]) && 
+                       (!m[2] || elem.id === m[2]) && 
+                       (!m[3] || m[3].test( elem.className )) &&
+                       (!m[4] || elem.getAttribute( m[4] ) == m[5]) &&
+                       (!m[6] || !elem[ m[6] ])
+               );
+       }
        
 function useNativeMethod( event ) {
        if ( !event.isDefaultPrevented() && this[ event.type ] ) {
@@ -91,14 +111,8 @@ jQuery.event = {
                        // Delegated event setup
                        if ( selector ) {
                                // Pre-analyze selector so we can process it quickly on event dispatch
-                               quick = handleObj.quick = rquickIs.exec( selector );
-                               if ( quick ) {
-                                       //   0  1    2   3      4         5          6
-                                       // [ _, tag, id, class, attrName, attrValue, pseudo(:empty :first-child :last-child) ]
-                                       quick[1] = ( quick[1] || "" ).toLowerCase();
-                                       quick[3] = quick[3] && new RegExp( "\\b" + quick[3] + "\\b" );
-                                       quick[6] = quickPseudoMap[ quick[6] ];
-                               } else if ( jQuery.expr.match.POS.test( selector ) ) {
+                               handleObj.quick = quickParse( selector );
+                               if ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) {
                                        handleObj.isPositional = true;
                                }
                        }
@@ -584,17 +598,6 @@ function dispatch( target, event, handlers, args ) {
        }
 }
 
-function quickIs( elem, m ) {
-       return (
-               (!m[1] || elem.nodeName.toLowerCase() === m[1]) && 
-               (!m[2] || elem.id === m[2]) && 
-               (!m[3] || m[3].test( elem.className )) &&
-               (!m[4] || elem.getAttribute( m[4] ) == m[5]) &&
-               (!m[6] || !elem[ m[6] ])
-       );
-}
-
-
 jQuery.removeEvent = document.removeEventListener ?
        function( elem, type, handle ) {
                if ( elem.removeEventListener ) {