Prevent IE from throwing errors when setting RGBA values. Fixes #5509.
[jquery.git] / src / css.js
index 77949ae..99cb735 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;
+                               }
                        }
                }
        },
@@ -78,7 +88,11 @@ jQuery.extend({
 
                        // If a hook was provided, use that value, otherwise just set the specified value
                        if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
-                               style[ name ] = value;
+                               // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+                               // Fixes bug #5509
+                               try {
+                                       style[ name ] = value;
+                               } catch(e) {}
                        }
 
                } else {
@@ -176,7 +190,7 @@ if ( !jQuery.support.opacity ) {
                        // IE uses filters for opacity
                        return ropacity.test((computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "") ?
                                (parseFloat(RegExp.$1) / 100) + "" :
-                               "1";
+                               computed ? "1" : "";
                },
 
                set: function( elem, value ) {
@@ -187,15 +201,14 @@ if ( !jQuery.support.opacity ) {
                        style.zoom = 1;
 
                        // Set the alpha filter to set the opacity
-                       var opacity = isNaN(value) ?
+                       var opacity = jQuery.isNaN(value) ?
                                "" :
-                               "alpha(opacity=" + value * 100 + ")";
-
-                       var filter = style.filter || elem.currentStyle && elem.currentStyle.filter || "";
+                               "alpha(opacity=" + value * 100 + ")",
+                               filter = style.filter || "";
 
                        style.filter = ralpha.test(filter) ?
                                filter.replace(ralpha, opacity) :
-                               opacity;
+                               style.filter + ' ' + opacity;
                }
        };
 }