PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)


Posted in Javascript onAugust 31, 2007

PNG.JS代码:
// PNGHandler: Object-Oriented Javascript-based PNG wrapper
// --------------------------------------------------------
// Version 1.1.20031218
// Code by Scott Schiller - www.schillmania.com
// --------------------------------------------------------
// Description:
// Provides gracefully-degrading PNG functionality where
// PNG is supported natively or via filters (Damn you, IE!)
// Should work with PNGs as images and DIV background images.

function PNGHandler() {
 var self = this;

 this.na = navigator.appName.toLowerCase();
 this.nv = navigator.appVersion.toLowerCase();
 this.isIE = this.na.indexOf('internet explorer')+1?1:0;
 this.isWin = this.nv.indexOf('windows')+1?1:0;
 this.ver = this.isIE?parseFloat(this.nv.split('msie ')[1]):parseFloat(this.nv);
 this.isMac = this.nv.indexOf('mac')+1?1:0;
 this.isOpera = (navigator.userAgent.toLowerCase().indexOf('opera ')+1 || navigator.userAgent.toLowerCase().indexOf('opera/')+1);
 if (this.isOpera) this.isIE = false; // Opera filter catch (which is sneaky, pretending to be IE by default)

 this.transform = null;

 this.getElementsByClassName = function(className,oParent) {
 doc = (oParent||document);
 matches = [];
 nodes = doc.all||doc.getElementsByTagName('*');
 for (i=0; i<nodes.length; i++) {
 if (nodes[i].className == className || nodes[i].className.indexOf(className)+1 || nodes[i].className.indexOf(className+' ')+1 || nodes[i].className.indexOf(' '+className)+1) {
 matches[matches.length] = nodes[i];
 }
 }
 return matches; // kids, don't play with fire. ;)
 }

 this.filterMethod = function(oOld) {
 // IE 5.5+ proprietary filter garbage (boo!)
 // Create new element based on old one. Doesn't seem to render properly otherwise (due to filter?)
 // use proprietary "currentStyle" object, so rules inherited via CSS are picked up.

 var o = document.createElement('div'); // oOld.nodeName
 var filterID = 'DXImageTransform.Microsoft.AlphaImageLoader';
 // o.style.width = oOld.currentStyle.width;
 // o.style.height = oOld.currentStyle.height;

 if (oOld.nodeName == 'DIV') {
 var b = oOld.currentStyle.backgroundImage.toString(); // parse out background image URL
 oOld.style.backgroundImage = 'none';
 // Parse out background image URL from currentStyle object.
 var i1 = b.indexOf('url("')+5;
 var newSrc = b.substr(i1,b.length-i1-2).replace('.gif','.png'); // find first instance of ") after (", chop from string
 o = oOld;
 o.style.writingMode = 'lr-tb'; // Has to be applied so filter "has layout" and is displayed. Seriously. Refer to http://msdn.microsoft.com/workshop/author/filter/reference/filters/alphaimageloader.asp?frame=true
 o.style.filter = "progid:"+filterID+"(src='"+newSrc+"',sizingMethod='crop')";
 // Replace the old (existing) with the new (just created) element.
 // oOld.parentNode.replaceChild(o,oOld);
 } else if (oOld.nodeName == 'IMG') {
 var newSrc = oOld.getAttribute('src').replace('.gif','.png');
 // apply filter
 oOld.src = 'none.gif'; // get rid of image
 oOld.style.filter = "progid:"+filterID+"(src='"+newSrc+"',sizingMethod='crop')";
 oOld.style.writingMode = 'lr-tb'; // Has to be applied so filter "has layout" and is displayed. Seriously. Refer to http://msdn.microsoft.com/workshop/author/filter/reference/filters/alphaimageloader.asp?frame=true
 }
 }

 this.pngMethod = function(o) {
 // Native transparency support. Easy to implement. (woo!)
 bgImage = this.getBackgroundImage(o);
 if (bgImage) {
 // set background image, replacing .gif
 o.style.backgroundImage = 'url('+bgImage.replace('.gif','.png')+')';
 } else if (o.nodeName == 'IMG') {
 o.src = o.src.replace('.gif','.png');
 } else if (!this.isMac) {
 // window.status = 'PNGHandler.applyPNG(): Node is not a DIV or IMG.';
 }
 }

 this.getBackgroundImage = function(o) {
 var b, i1; // background-related variables
 var bgUrl = null;

 if (o.nodeName == 'DIV' && !(this.isIE && this.isMac)) { // ie:mac PNG support broken for DIVs with PNG backgrounds
 if (document.defaultView) {
 if (document.defaultView.getComputedStyle) {
 b = document.defaultView.getComputedStyle(o,'').getPropertyValue('background-image');
 i1 = b.indexOf('url(')+4;
 bgUrl = b.substr(i1,b.length-i1-1);
 } else {
 // no computed style
 }
 } else {
 // no default view
 }
 }
 return bgUrl;
 }

 this.supportTest = function() {
 // Determine method to use.
 // IE 5.5+/win32: filter

 if (this.isIE && this.isWin && this.ver >= 5.5) {
 // IE proprietary filter method (via DXFilter)
 self.transform = self.filterMethod;
 } else if (!this.isIE && this.ver < 5) {
 self.transform = null;
 // No PNG support or broken support
 // Leave existing content as-is
 } else if (!this.isIE && this.ver >= 5 || (this.isIE && this.isMac && this.ver >= 5)) { // version 5+ browser (not IE), or IE:mac 5+
 self.transform = self.pngMethod;
 } else {
 // Presumably no PNG support. GIF used instead.
 self.transform = null;
 return false;
 }
 return true;
 }

 this.init = function() {
 if (this.supportTest()) {
 this.elements = this.getElementsByClassName('png');
 for (var i=0; i<this.elements.length; i++) {
 this.transform(this.elements[i]);
 }
 }
 }

}

// Instantiate and initialize PNG Handler

var pngHandler = new PNGHandler();

DEMO页HTML代码:
<html>
<head>
<title>Schillmania! | png.js demo</title>
<script type="text/javascript" src="png.js"></script>
</head>

<body>

<!--

 Don't copy this part here, this is just for your information.

 // Required under the <head> tag:

 <script type="text/javascript" src="png.js"></script>

 // Required in the <body> tag:

 <img src="your-image.gif" class="png" style="width:XXXpx;height:YYYpx" />

 // ..Where XXX and YYY are the width/height of your image. Without width/height the PNG won't work under IE:win32.

 // Required before the </body> tag (but after all of your content):

 <script type="text/javascript">
 pngHandler.init();
 </script>

 // This javascript block should be put at the bottom of your page, inside the <body> and before </body>.
 // It calls the library and replaces the GIF images (if applicable) before the page has loaded (and before the GIF has loaded, So the user doesn't load 2 images for each PNG you want to replace.)
 // If you don't put it after all of your content, it may do strange things and miss some images.

-->

<h1>PNG (img)</h1>

<img src="foo.gif" alt="" class="png" style="width:220px;height:100px" />

<h1>PNG (div with background image)</h1>

<div class="png" style="width:220px;height:100px;background-image:url(foo.gif);background-repeat:no-repeat">
  
</div>

<script type="text/javascript">
 pngHandler.init();
</script>

</body>
</html>

源码及DEMO打包下载:
本地下载

Javascript 相关文章推荐
javascript 无提示关闭窗口脚本
Aug 17 Javascript
jquery mobile changepage的三种传参方法介绍
Sep 13 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
May 11 Javascript
学习Bootstrap组件之下拉菜单
Jul 28 Javascript
jQuery文件上传控件 Uploadify 详解
Jun 20 Javascript
同步文本框内容JS代码实现
Aug 04 Javascript
js Canvas实现圆形时钟教程
Sep 19 Javascript
javascript入门之string对象【新手必看】
Nov 22 Javascript
ionic+AngularJs实现获取验证码倒计时按钮
Apr 22 Javascript
理解Koa2中的async&amp;await的用法
Feb 05 Javascript
React学习之JSX与react事件实例分析
Jan 06 Javascript
在vue中使用echarts(折线图的demo,markline用法)
Jul 20 Javascript
给Javascript数组插入一条记录的代码
Aug 30 #Javascript
用javascript实现给出的盒子的序列是否可连为一矩型
Aug 30 #Javascript
Expandable &quot;Detail&quot; Table Rows
Aug 29 #Javascript
出现“不能执行已释放的Script代码”错误的原因及解决办法
Aug 29 #Javascript
推荐一些非常不错的javascript学习资源站点
Aug 29 #Javascript
070823更新的一个[消息提示框]组件 兼容ie7
Aug 29 #Javascript
找到了一篇jQuery与Prototype并存的冲突的解决方法
Aug 29 #Javascript
You might like
PHP加密函数 Javascript/Js 解密函数
2013/09/23 PHP
PHP单例模式详细介绍
2015/07/01 PHP
PHP程序员不应该忽略的3点
2015/10/09 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
2015/12/18 PHP
php车辆违章查询数据示例
2016/10/14 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
为超链接加上disabled后的故事
2010/12/10 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
jQuery多级手风琴菜单实例讲解
2015/10/22 Javascript
jQuery结合CSS制作动态的下拉菜单
2015/10/27 Javascript
利用JS判断鼠标移入元素的方向
2016/12/11 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
理解 JavaScript EventEmitter
2018/03/29 Javascript
简单实现vue中的依赖收集与响应的方法
2019/02/18 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
JavaScript基于用户照片姓名生成海报
2020/05/29 Javascript
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
python中的decimal类型转换实例详解
2019/06/26 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
汤米巴哈马官方网站:Tommy Bahama
2017/05/13 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
保送生自荐信范文
2013/10/06 职场文书
社区八一活动方案
2014/02/03 职场文书
商务英语广告词大全
2014/03/18 职场文书
六个一活动实施方案
2014/03/21 职场文书
股权转让协议范本
2014/12/07 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书