您好,欢迎访问一九零五行业门户网

base64图片在各种浏览器的兼容性处理 - 小化·较瘦

ie浏览器目前最高的版本是v11,而微软放弃了ie,转向新的浏览器开发,并取名为edge。base64图片在ie9及以后的图片均能显示没有问题,而firefox, chrome, safari等非ie浏览器都能正常显示,所以显得ie浏览器比较low。那么兼容性究竟应该怎么来处理呢? 分三种情况。
(1)ie9+、firefox、chrome、safari等浏览器
base64图片在html里的标准写法是:
javascript给img元素的src属性赋值或是给其他元素的backgroundimage属性赋值都可以正确的显示图片。
其格式为     data:{mimetype};base64,{code}
{mimetype}是指图片的格式类型,一般来说,jpg文件填写image/jpeg,  gif文件填写image/gif, png文件填写 image/png。
{code}是指图片二进制转换成base64的字符串。
(2)ie6、ie7浏览器
低版本的ie浏览器不支持img的src属性用data:image/jpeg这样写,但是我们可以使用mhtml调用附件资源的形式来处理图片。格式如下:
1
view code
其中,bondary=imagedata中的imagedata是指图片的标识前缀,可任意命名,所有的图片流都以这个两个减号和该前缀开头。content-location: showimg中的showimg是指图片的标识名称,可任意命名,ie6和ie7的css调方法为  .non_img_tag { *background-image: expression('mhtml:http://test.oa.com/base64.html!showimg'); } 其中*background-image里*表示只有ie6 ie7 ie8才能访问的css属性,俗称css hack。showimg是放在当前网页的网址加一个感叹号后面。expression是ie浏览器早期版本才支持,可用于js调用,隐患很大,其他浏览器不支持。mhtml是微软的一种网页格式,其扩展名为.mht,它会把网页中需要的图片写到单一的文件里。ie右键菜单点击另存为...会有单一文件选项。
 注意:因为ie6和ie7不支持data:image/jpeg这样写,所以我们只能使用非img标签的background-image属性来操作,并且这种操作不支持javascript来改变它的值,只能使用css。这段注释可以放在任何地方。但是为了好调用,我把它放在文件头部。
(3)ie8浏览器
ie8浏览器分两种情况。一种是在xp下ie6升级到ie8,另一种是win7自带的ie8。两者的区别是xp下的ie8不支持javascript直接将backgroundimage赋值为base64值。但是win7下是可以的。
如何兼容
在代码上我们使用useragent里的trident和windows nt版本来确认ie8在何种情况使用:
a.当nt版本是nt 5.x并且trident没现出现的时候,判定为xp下的ie6和ie7,执行第2种情况;
b.当nt版本是nt 5.x并且trident 4.0的时候,判定为xp下的ie8,执行第2种情况;
c.当nt版本是nt 6.x时,为win7、win8、win10系统,执行第1种情况;
d.都不是时,就是非ie流览器,执行第1种情况
完整的代码如下:
1 19 html>20 head>21 meta http-equiv=content-type content=text/html; charset=gb2312 />22 meta http-equiv=x-ua-compatible content=ie=edge,chrome=1 /> 23 title>base64图片兼容性测试title>24 head>25 body>26 div id=useragent style=width:200px;>div>27 div id=showimg style=width:100px; height:100px; float:left; *background-image:expression('url(mhtml:' + location.href + '!showimg)');>div>28 div id=img2 style=width:100px; height:100px; float:left; *background-image:expression('url(mhtml:' + location.href + '!img2)');>div>29 script type=text/javascript>30 function setimage(obj) {31 // for ie6、ie7、ie832 if (!/trident/.test(navigator.useragent) && /msie [6-8]\.0.*windows nt 5\./.test(navigator.useragent)) return ;33 //for ie9 or later、firefox 、chrome 、opera34 var html = document.firstchild.nodevalue;35 var reg = new regexp(--imagedata\\s*[\\r\\n]+content-type:\\s*(image\\/\\w+)\s*[\\r\\n\\s]+content-location:\\s* + obj + \\s*content-transfer-encoding:\\s*base64\\s*[\\r\\n\\s]+([a-za-z0-9\\/\\+\\r\\n=]+), g);36 var codepart = reg.exec(html);37 document.getelementbyid(obj).style.backgroundimage = url(data: + codepart[1] + ;base64, + codepart[2] + );38 }39 setimage(showimg);40 setimage(img2);41 document.getelementbyid(useragent).innerhtml = navigator.useragent;42 script>43 body>44 html>
view code
执行效果
其它类似信息

推荐信息