X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=src%2Fselector.js;h=1badc693299a7a58878f5466fdbf4a1a756d2f0b;hb=bdd6aca209fe79bc6a085693008436cce37d5b31;hp=b272acd4fe771294ab1eeac731254157e190951e;hpb=084079d2fd1c7ed3582612cc32b01346b43fb415;p=jquery.git diff --git a/src/selector.js b/src/selector.js index b272acd..1badc69 100644 --- a/src/selector.js +++ b/src/selector.js @@ -96,15 +96,15 @@ jQuery.extend({ if ( typeof t != "string" ) return [ t ]; - // Make sure that the context is a DOM Element - if ( context && !context.nodeType ) - context = null; + // check to make sure context is a DOM element or a document + if ( context && context.nodeType != 1 && context.nodeType != 9) + return [ ]; // Set the correct context (if none is provided) context = context || document; // Initialize the search - var ret = [context], done = [], last; + var ret = [context], done = [], last, nodeName; // Continue while a selector expression exists, and while // we're no longer looping upon ourselves @@ -122,12 +122,12 @@ jQuery.extend({ var m = re.exec(t); if ( m ) { - var nodeName = m[1].toUpperCase(); + nodeName = m[1].toUpperCase(); // Perform our own iteration and filter for ( var i = 0; ret[i]; i++ ) for ( var c = ret[i].firstChild; c; c = c.nextSibling ) - if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName.toUpperCase()) ) + if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) ) r.push( c ); ret = r; @@ -140,7 +140,8 @@ jQuery.extend({ if ( (m = re.exec(t)) != null ) { r = []; - var nodeName = m[2], merge = {}; + var merge = {}; + nodeName = m[2].toUpperCase(); m = m[1]; for ( var j = 0, rl = ret.length; j < rl; j++ ) { @@ -151,7 +152,7 @@ jQuery.extend({ if ( m == "~" && merge[id] ) break; - if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) { + if (!nodeName || n.nodeName.toUpperCase() == nodeName ) { if ( m == "~" ) merge[id] = true; r.push( n ); } @@ -320,7 +321,10 @@ jQuery.extend({ // :not() is a special case that can be optimized by // keeping it out of the expression list if ( m[1] == ":" && m[2] == "not" ) - r = jQuery.filter(m[3], r, true).r; + // optimize if only one selector found (most common case) + r = isSimple.test( m[3] ) ? + jQuery.filter(m[3], r, true).r : + jQuery( r ).not( m[3] ); // We can get a big speed boost by filtering by class here else if ( m[1] == "." ) @@ -436,3 +440,4 @@ jQuery.extend({ return r; } }); +