Fix :visible does not work properly when display:none is set directly on an element...
[jquery.git] / src / css.js
index 8ea815c..8751860 100644 (file)
@@ -1,6 +1,6 @@
 (function( jQuery ) {
 
-var ralpha = /alpha\([^)]*\)/,
+var ralpha = /alpha\([^)]*\)/i,
        ropacity = /opacity=([^)]*)/,
        rdashAlpha = /-([a-z])/ig,
        rupper = /([A-Z])/g,
@@ -20,6 +20,11 @@ var ralpha = /alpha\([^)]*\)/,
        };
 
 jQuery.fn.css = function( name, value ) {
+       // Setting 'undefined' is a no-op
+       if ( arguments.length === 2 && value === undefined ) {
+               return this;
+       }
+
        return jQuery.access( this, name, value, true, function( elem, name, value ) {
                return value !== undefined ?
                        jQuery.style( elem, name, value ) :
@@ -32,10 +37,15 @@ jQuery.extend({
        // behavior of getting and setting a style property
        cssHooks: {
                opacity: {
-                       get: function( elem ) {
-                               // We should always get a number back from opacity
-                               var ret = curCSS( elem, "opacity", "opacity" );
-                               return ret === "" ? "1" : ret;
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // We should always get a number back from opacity
+                                       var ret = curCSS( elem, "opacity", "opacity" );
+                                       return ret === "" ? "1" : ret;
+
+                               } else {
+                                       return elem.style.opacity;
+                               }
                        }
                }
        },
@@ -64,7 +74,7 @@ jQuery.extend({
                }
 
                // Make sure that we're working with the right name
-               var ret, origName = name.replace( rdashAlpha, fcamelCase ),
+               var ret, origName = jQuery.camelCase( name ),
                        style = elem.style, hooks = jQuery.cssHooks[ origName ];
 
                name = jQuery.cssProps[ origName ] || origName;
@@ -94,7 +104,7 @@ jQuery.extend({
 
        css: function( elem, name, extra ) {
                // Make sure that we're working with the right name
-               var ret, origName = name.replace( rdashAlpha, fcamelCase ),
+               var ret, origName = jQuery.camelCase( name ),
                        hooks = jQuery.cssHooks[ origName ];
 
                name = jQuery.cssProps[ origName ] || origName;
@@ -125,6 +135,10 @@ jQuery.extend({
                for ( name in options ) {
                        elem.style[ name ] = old[ name ];
                }
+       },
+
+       camelCase: function( string ) {
+               return string.replace( rdashAlpha, fcamelCase );
        }
 });
 
@@ -151,7 +165,7 @@ jQuery.each(["height", "width"], function( i, name ) {
                },
 
                set: function( elem, value ) {
-                       if ( value !== "" ) {
+                       if ( rnumpx.test( value ) ) {
                                // ignore negative width and height values #1599
                                value = parseFloat(value);
 
@@ -170,9 +184,9 @@ if ( !jQuery.support.opacity ) {
        jQuery.cssHooks.opacity = {
                get: function( elem, computed ) {
                        // IE uses filters for opacity
-                       return ropacity.test((computed ? elem.currentStyle.filter : elem.style.filter) || "") ?
+                       return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
                                (parseFloat(RegExp.$1) / 100) + "" :
-                               "1";
+                               computed ? "1" : "";
                },
 
                set: function( elem, value ) {
@@ -183,15 +197,14 @@ if ( !jQuery.support.opacity ) {
                        style.zoom = 1;
 
                        // Set the alpha filter to set the opacity
-                       var opacity = parseInt( value, 10 ) + "" === "NaN" ?
+                       var opacity = jQuery.isNaN(value) ?
                                "" :
-                               "alpha(opacity=" + value * 100 + ")";
-
-                       var filter = style.filter || elem.currentStyle.filter || "";
+                               "alpha(opacity=" + value * 100 + ")",
+                               filter = style.filter || "";
 
                        style.filter = ralpha.test(filter) ?
                                filter.replace(ralpha, opacity) :
-                               opacity;
+                               style.filter + ' ' + opacity;
                }
        };
 }
@@ -215,7 +228,7 @@ if ( getComputedStyle ) {
 
 } else if ( document.documentElement.currentStyle ) {
        curCSS = function( elem, name ) {
-               var left, rsLeft, ret = elem.currentStyle[ name ], style = elem.style;
+               var left, rsLeft, ret = elem.currentStyle && elem.currentStyle[ name ], style = elem.style;
 
                // From the awesome hack by Dean Edwards
                // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
@@ -267,14 +280,9 @@ function getWH( elem, name, extra ) {
 
 if ( jQuery.expr && jQuery.expr.filters ) {
        jQuery.expr.filters.hidden = function( elem ) {
-               var width = elem.offsetWidth, height = elem.offsetHeight,
-                       skip = elem.nodeName.toLowerCase() === "tr";
-
-               return width === 0 && height === 0 && !skip ?
-                       true :
-                       width > 0 && height > 0 && !skip ?
-                               false :
-                               (elem.style.display || jQuery.css( elem, "display" )) === "none";
+               var width = elem.offsetWidth, height = elem.offsetHeight;
+
+               return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
        };
 
        jQuery.expr.filters.visible = function( elem ) {