Added a fix for $("object *") in IE7.
[jquery.git] / src / selector / selector.js
index 7f71e2e..e9e859e 100644 (file)
@@ -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<Element>
@@ -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 <object>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 )