From 64e4a879f9f92053ac4d58a3fffc0bbff6900b6e Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Tue, 1 Dec 2009 11:40:28 -0800 Subject: [PATCH] Fix css("opacity") to not clobber other filters in IE. Closes #4707. --- src/css.js | 5 +++-- test/unit/css.js | 23 +++++++++++++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/css.js b/src/css.js index 38007b7..ceed4e6 100644 --- a/src/css.js +++ b/src/css.js @@ -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 ? diff --git a/test/unit/css.js b/test/unit/css.js index beac04a..270638e 100644 --- a/test/unit/css.js +++ b/test/unit/css.js @@ -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); -- 1.7.10.4