Fixed #2037 where Opera would mis-state the value of 'display' after an innerHTML...
[jquery.git] / src / core.js
index 30820bf..c7f30d6 100644 (file)
@@ -29,6 +29,9 @@ window.$ = jQuery;
 // (both of which we optimize for)
 var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
 
+// Is it a simple selector
+var isSimple = /^.[^:#\[\.]*$/;
+
 jQuery.fn = jQuery.prototype = {
        init: function( selector, context ) {
                // Make sure that a selection was provided
@@ -342,14 +345,16 @@ jQuery.fn = jQuery.prototype = {
        },
 
        not: function( selector ) {
-               if (selector.constructor == String)
+               if ( selector.constructor == String )
                        // test special case where just one selector is passed in
-                       if ( /^.[^:#\[\.]*$/.test(selector) )
+                       if ( isSimple.test( selector ) )
                                return this.pushStack( jQuery.multiFilter( selector, this, true ) );
                        else
                                selector = jQuery.multiFilter( selector, this );
 
-               return this.pushStack( jQuery.removeFromArray( selector, this ) );
+               return this.filter(function() {
+                       return jQuery.inArray( this, selector ) < 0;
+               });
        },
 
        add: function( selector ) {
@@ -413,31 +418,32 @@ jQuery.fn = jQuery.prototype = {
 
                        }
 
-               } else
-                       return this.each(function(){
-                               if ( this.nodeType != 1 )
-                                       return;
+               }
 
-                               if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
-                                       this.checked = (jQuery.inArray(this.value, value) >= 0 ||
-                                               jQuery.inArray(this.name, value) >= 0);
+               return this.each(function(){
+                       if ( this.nodeType != 1 )
+                               return;
 
-                               else if ( jQuery.nodeName( this, "select" ) ) {
-                                       var values = value.constructor == Array ?
-                                               value :
-                                               [ value ];
+                       if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
+                               this.checked = (jQuery.inArray(this.value, value) >= 0 ||
+                                       jQuery.inArray(this.name, value) >= 0);
 
-                                       jQuery( "option", this ).each(function(){
-                                               this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
-                                                       jQuery.inArray( this.text, values ) >= 0);
-                                       });
+                       else if ( jQuery.nodeName( this, "select" ) ) {
+                               var values = value.constructor == Array ?
+                                       value :
+                                       [ value ];
 
-                                       if ( !values.length )
-                                               this.selectedIndex = -1;
+                               jQuery( "option", this ).each(function(){
+                                       this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
+                                               jQuery.inArray( this.text, values ) >= 0);
+                               });
 
-                               } else
-                                       this.value = value;
-                       });
+                               if ( !values.length )
+                                       this.selectedIndex = -1;
+
+                       } else
+                               this.value = value;
+               });
        },
        
        html: function( value ) {
@@ -810,6 +816,12 @@ jQuery.extend({
                                "1" :
                                ret;
                }
+               // Opera sometimes will give the wrong display answer, this fixes it, see #2037
+               if ( jQuery.browser.opera && name == "display" ) {
+                       var save = elem.style.display;
+                       elem.style.display = "block";
+                       elem.style.display = save;
+               }
                
                // Make sure we're using the right name for getting the float value
                if ( name.match( /float/i ) )
@@ -966,9 +978,9 @@ jQuery.extend({
                                                        div.childNodes :
                                                        [];
                                
-                                       for ( var i = tbody.length - 1; i >= 0 ; --i )
-                                               if ( jQuery.nodeName( tbody[ i ], "tbody" ) && !tbody[ i ].childNodes.length )
-                                                       tbody[ i ].parentNode.removeChild( tbody[ i ] );
+                                       for ( var j = tbody.length - 1; j >= 0 ; --j )
+                                               if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
+                                                       tbody[ j ].parentNode.removeChild( tbody[ j ] );
                                        
                                        // IE completely kills leading whitespace when innerHTML is used        
                                        if ( /^\s/.test( elem ) )       
@@ -1092,13 +1104,6 @@ jQuery.extend({
                return -1;
        },
 
-       removeFromArray: function( remove, from ) {
-               var isArrayLike = remove.length && remove[remove.length - 1] !== undefined;
-               return jQuery.grep(from, function(elem) {
-                               return isArrayLike ? jQuery.inArray( elem, remove ) < 0 : elem != from;
-                       });
-       },
-
        merge: function( first, second ) {
                // We have to loop this way because IE & Opera overwrite the length
                // expando of getElementsByTagName