While using the jQuery javascript library today at work, I noticed a glitch under IE7. When fading a html node with the .fadeIn() and .fadeOut() functions in jQuery, IE drops the windows Cleartype rendering; which results in very ugly text. This problem appears to be very common, but no one has a nice solution for the problem.
The most common way to solve this problem is by removing the filter
CSS attribute. In normal javascript, it would look like this:
document.getElementById('node').style.removeAttribute('filter');
and in jQuery, it would look like this:
$('#node').fadeOut('slow', function() { this.style.removeAttribute('filter'); });
This means that every single time we want to fade an element, we need to remove the filter
attribute, which makes our code look messy.
A simple, more elegant solution would be to wrap the .fadeIn() and .fadeOut() functions with a custom function via the plugin interface of jQuery. The code would be exactly the same, but instead of directly calling the fade functions, we call the wrapper. Like so:
$('#node').customFadeOut('slow', function() { //no more fiddling with attributes here });
So, how do you get this working? Just include the following code after you include the jQuery library for the added functionality.
(function($) { $.fn.customFadeIn = function(speed, callback) { $(this).fadeIn(speed, function() { if(jQuery.browser.msie) $(this).get(0).style.removeAttribute('filter'); if(callback != undefined) callback(); }); }; $.fn.customFadeOut = function(speed, callback) { $(this).fadeOut(speed, function() { if(jQuery.browser.msie) $(this).get(0).style.removeAttribute('filter'); if(callback != undefined) callback(); }); }; })(jQuery);
I have been informed by Steve Reynolds that the US Whitehouse Website is using some of the JS documented on this blog post. I would just like to say thanks to everyone who contributed in the comments. :)