Wow Christof,

that heaps for such a detailed reply and explanation.
It will take me some time fully understand whole thing.

for now though, to get my project moving I've used part of your code to come up with this, tested

http://www.nemoweb.com.au/jquery/IEPNGHack/take3.html

Feedback is appreciated

--Kush

Christof Donat wrote:
Hi,

I've wrote very simple JQuery IE PNG hack plugin.
Would like to know your professional opinion, to make it better

Great idea.

Generally you can set the filter for the img tag as well, you just need a fully transparent gif (or png) for the src.

jQuery.fn.IEPNGHack = function() {
        if (!$.browser.msie) return false;
        this.each(function() {
                var t = $(this);
                var url = t.attr('src');
                t.css({
                'filter':
                
'progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+url+"',sizingMethod='scale')'
                }).attr({src:jQuery.IEPNGHack.emptygif});
        });
};
jQuery.IEPNGHack = {
        emptygif = 'empty.gif';
}
        
$(document).ready(function(){
        jQuery.IEPNGHack.emptygif = 
'http://example.com/design/images/empty.gif';
        $('[EMAIL PROTECTED]').IEPNGHack();
});

You might also whant to fix IE for background-images:

jQuery.fn.IEPNGHack = function() {
        if (!$.browser.msie) return false;
        this.filter('[EMAIL PROTECTED]').each(function() {
                var t = $(this);
                var url = t.attr('src');
                var w = t.width(); // width and height might be implicit
                var h = t.height();
                t.css({  // have not tested if this works theoretically it 
should
                        filter:
                        
'progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+url+"',sizingMethod='scale')'
                }).attr({src:jQuery.IEPNGHack.emptygif}).width(w).height(h);
        }).end().not('[EMAIL PROTECTED]')
                .filter('img')
                        .not('[EMAIL 
PROTECTED]'+jQuery.IEPNGHack.emptygif+']').css({filter:none})
                .end()
        .end().not('img').each(function() {
                var t = $(this);
                var url = t.css('background-image');
                if( url.search(/[.]png$/) >= 0 ) t.css({
                        filter:
                        
"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+url+"',sizingMethod='scale')",
                        'background-image': 'none'
                }); else t.css({filter: 'none'});
        });
};

$(document).ready(function(){
        $('.hasSomePngSomewhere').IEPNGHack();
});

Note, that this background-image hack only works for 1x1 pixel PNGs. In most other cases, you won't be able to use the content of the Element you have set a transparent PNG for.

It could be fixed by inserting an element with "position" set to "absolute", resize it to the size of the whole element and set the filter for it. But if you try to use that for structured semitransparent background you also have the problem, that AFAIK there is no sizingMethod that behaves like the css background-feature. Setting it to "scale" is OK for a homogenous background.

BTW: This function can be called again and again for all images - at least theoretically, I have not tested it.

Christof

_______________________________________________
jQuery mailing list
discuss@jquery.com
http://jquery.com/discuss/

--

Cheers,

Kush



Sensory Networks

Web Applications Developer

Direct: + 61 2 8302 2745

Phone: + 61 2 8302 2700

Fax: + 61 2 9475 0316

_______________________________________________
jQuery mailing list
discuss@jquery.com
http://jquery.com/discuss/

Reply via email to