X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fselector%2Fselector.js;h=867bc4ef52231700dcd05aa43484aa1d7256e38f;hb=ed5bda3020bd418ad8edb477ad2b1fd8b313cc04;hp=4633c3094c23ca14132159cfb3311ce88fb83f67;hpb=c3d8cb0c09c2d7d5f0fc3a78f8b4cef9b0adc640;p=jquery.git diff --git a/src/selector/selector.js b/src/selector/selector.js index 4633c30..867bc4e 100644 --- a/src/selector/selector.js +++ b/src/selector/selector.js @@ -59,7 +59,7 @@ jQuery.extend({ _resort: function(m){ return ["", m[1], m[3], m[2], m[5]]; }, - _prefix: "z=jQuery.attr(a,m[3]);" + _prefix: "z=a[m[3]]||jQuery.attr(a,m[3]);" }, "[": "jQuery.find(m[2],a).length" }, @@ -70,10 +70,10 @@ jQuery.extend({ "\\[ *(@)S *([!*$^=]*) *('?\"?)(.*?)\\4 *\\]", // Match: [div], [div p] - "(\\[)\\s*(.*?)\\s*\\]", + "(\\[)\\s*(.*?(\\[.*?\\])?[^[]*?)\\s*\\]", // Match: :contains('foo') - "(:)S\\(\"?'?([^\\)]*?)\"?'?\\)", + "(:)S\\(\"?'?(.*?(\\(.*?\\))?[^(]*?)\"?'?\\)", // Match: :even, :last-chlid "([:.#]*)S" @@ -89,6 +89,19 @@ jQuery.extend({ } ], + multiFilter: function( expr, elems, not ) { + var old, cur = []; + + while ( expr && expr != old ) { + old = expr; + var f = jQuery.filter( expr, elems, not ); + expr = f.t.replace(/^\s*,\s*/, "" ); + cur = not ? elems = f.r : jQuery.merge( cur, f.r ); + } + + return cur; + }, + /** * @name $.find * @type Array @@ -101,7 +114,7 @@ jQuery.extend({ return [ t ]; // Make sure that the context is a DOM Element - if ( context && context.nodeType == undefined ) + if ( context && !context.nodeType ) context = null; // Set the correct context (if none is provided) @@ -159,7 +172,7 @@ jQuery.extend({ // If the token match was found if ( m ) { // Map it against the token's handler - r = ret = jQuery.map( ret, jQuery.token[i+1].constructor == Function ? + r = ret = jQuery.map( ret, jQuery.isFunction( jQuery.token[i+1] ) ? jQuery.token[i+1] : function(a){ return eval(jQuery.token[i+1]); }); @@ -175,8 +188,8 @@ jQuery.extend({ // matched a token if ( t && !foundToken ) { // Handle multiple expressions - if ( !t.indexOf(",") || !t.indexOf("|") ) { - // Clean teh result set + if ( !t.indexOf(",") ) { + // Clean the result set if ( ret[0] == context ) ret.shift(); // Merge the result sets @@ -214,10 +227,6 @@ jQuery.extend({ ret = r = oid && (!m[3] || oid.nodeName == m[3].toUpperCase()) ? [oid] : []; - // Use the DOM 0 shortcut for the body element - } else if ( m[1] == "" && m[2] == "body" ) { - ret = r = [ document.body ]; - } else { // Pre-compile a regular expression to handle class searches if ( m[1] == "." ) @@ -226,12 +235,20 @@ jQuery.extend({ // We need to find all descendant elements, it is more // efficient to use getAll() when we are already further down // the tree - we try to recognize that here - for ( var i = 0, rl = ret.length; i < rl; i++ ) + for ( var i = 0, rl = ret.length; i < rl; i++ ) { + // Grab the tag name being searched for + var tag = m[1] != "" || m[0] == "" ? "*" : m[2]; + + // Handle IE7 being really dumb about s + if ( ret[i].nodeName.toUpperCase() == "OBJECT" && tag == "*" ) + tag = "param"; + jQuery.merge( r, m[1] != "" && ret.length != 1 ? jQuery.getAll( ret[i], [], m[1], m[2], rec ) : - ret[i].getElementsByTagName( m[1] != "" || m[0] == "" ? "*" : m[2] ) + ret[i].getElementsByTagName( tag ) ); + } // It's faster to filter by class and be done with it if ( m[1] == "." && ret.length == 1 ) @@ -295,13 +312,13 @@ jQuery.extend({ var m = re.exec( t ); if ( m ) { + // Remove what we just matched + t = t.substring( m[0].length ); + // Re-organize the first match if ( jQuery.expr[ m[1] ]._resort ) m = jQuery.expr[ m[1] ]._resort( m ); - // Remove what we just matched - t = t.replace( re, "" ); - break; } } @@ -423,4 +440,4 @@ jQuery.extend({ return r; } -}); \ No newline at end of file +});