Fix css("opacity") to not clobber other filters in IE. Closes #4707.
authorYehuda Katz <wycats@Yehuda-Katz.local>
Tue, 1 Dec 2009 19:40:28 +0000 (11:40 -0800)
committerYehuda Katz <wycats@Yehuda-Katz.local>
Tue, 1 Dec 2009 19:40:28 +0000 (11:40 -0800)
src/css.js
test/unit/css.js

index 38007b7..ceed4e6 100644 (file)
@@ -52,8 +52,9 @@ jQuery.extend({
                                style.zoom = 1;
 
                                // Set the alpha filter to set the opacity
-                               style.filter = (style.filter || "").replace( ralpha, "" ) +
-                                       (parseInt( value, 10 ) + '' === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
+                               var opacity = parseInt( value, 10 ) + '' === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")";
+                               filter = style.filter || jQuery.curCSS( elem, 'filter' ) || ""
+                               style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity;
                        }
 
                        return style.filter && style.filter.indexOf("opacity=") >= 0 ?
index beac04a..270638e 100644 (file)
@@ -52,7 +52,7 @@ test("css(String|Hash)", function() {
 });
 
 test("css(String, Object)", function() {
-       expect(21);
+       expect(20);
        ok( jQuery('#nothiddendiv').is(':visible'), 'Modifying CSS display: Assert element is visible');
        jQuery('#nothiddendiv').css("display", 'none');
        ok( !jQuery('#nothiddendiv').is(':visible'), 'Modified CSS display: Assert element is hidden');
@@ -76,11 +76,6 @@ test("css(String, Object)", function() {
        });
        jQuery('#foo').css('opacity', '');
        equals( jQuery('#foo').css('opacity'), '1', "Assert opacity is 1 when set to an empty String" );
-       // for #1438, IE throws JS error when filter exists but doesn't have opacity in it
-       if (jQuery.browser.msie) {
-               jQuery('#foo').css("filter", "progid:DXImageTransform.Microsoft.Chroma(color='red');");
-       }
-       equals( jQuery('#foo').css('opacity'), '1', "Assert opacity is 1 when a different filter is set in IE, #1438" );
 
        // using contents will get comments regular, text, and comment nodes
        var j = jQuery("#nonnodes").contents();
@@ -92,6 +87,22 @@ test("css(String, Object)", function() {
        equals( jQuery("#t2037 .hidden").css("display"), "none", "Make sure browser thinks it is hidden" );
 });
 
+if(jQuery.browser.msie) {
+  test("css(String, Object) for MSIE", function() {
+    // for #1438, IE throws JS error when filter exists but doesn't have opacity in it
+               jQuery('#foo').css("filter", "progid:DXImageTransform.Microsoft.Chroma(color='red');");
+       equals( jQuery('#foo').css('opacity'), '1', "Assert opacity is 1 when a different filter is set in IE, #1438" );
+
+    var filterVal = "progid:DXImageTransform.Microsoft.alpha(opacity=30) progid:DXImageTransform.Microsoft.Blur(pixelradius=5)";
+    var filterVal2 = "progid:DXImageTransform.Microsoft.alpha(opacity=100) progid:DXImageTransform.Microsoft.Blur(pixelradius=5)";
+    jQuery('#foo').css("filter", filterVal);
+    equals( jQuery('#foo').css("filter"), filterVal, "css('filter', val) works" );
+    jQuery('#foo').css("opacity", 1)
+    equals( jQuery('#foo').css("filter"), filterVal2, "Setting opacity in IE doesn't clobber other filters" );
+    equals( jQuery('#foo').css("opacity"), 1, "Setting opacity in IE with other filters works" )
+  });
+}
+
 test("css(String, Function)", function() {
        try { 
                expect(3);