JavaScript教程:详细解析网页图片预览效果(8)

http://www.itjxue.com  2015-08-06 23:08  来源:未知  点击次数: 

Data URI 和 MHTML

上面已经多次提到Data URI,详细介绍请看秦歌的“Data URI 和 MHTML”。
Data URI的主要作用是以字符代替数据,从而把文件“嵌”在代码里。
除了ie,其他浏览器基本都很好的支持了Data URI。
ie8也有限度地支持,详细参考msdn的data Protocol

由于opera,safari和chrome需要remote模式的浏览器都支持Data URI,所以程序返回的是Data URI形式的数据。
相比返回路径的方法,返回Data URI不需要创建文件,还少一次HTTP请求。
ps:ie8只支持32k的Data URI数据,在ie8使用时要注意数据大小。

在filter模式需要一个透明图片来去掉img默认显示的小图标,一般的方法需要一个图片文件。
为了“省下”这个文件,可以使用Data URI来做一个1*1的透明图片:

data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAA
LAAAAAABAAEAAAICRAEAOw==

支持Data URI的情况下,只要把img的src设置为这个值就可以显示一个透明图片了。

虽然ie6/7不支持Data URI,还可以用mhtml来代替。
在ImagePreviewd.js开头有一段注释了的代码:

Content-Type: multipart/related; boundary="_CLOUDGAMER"
--_CLOUDGAMER
Content-Location:blankImage
Content-Transfer-Encoding:base64
R0lGODlhAQABAJEAAAAAAP///////wAAACH5BAEAAAIALA
AAAAABAAEAAAICVAEAOw==

这是mhtml记录数据的形式,调用时要按以下格式设置img的src:
mhtml:文件完整路径!blankImage

其中blankImage表示要获取的数据在文件对应的Content-Location。
问题在于如何获得script(js文件)的完整路径(包含http开头的路径)。
首先要在脚本运行时获取,当前运行的script肯定是document.scripts的最后一个:
document.scripts[document.scripts.length - 1]
ps:document.scripts详细参考msdn的scripts Collection,ff不支持,可以用getElementsByTagName("script")兼容。
接着可以利用getAttribute从src获取script的完整路径:

document.scripts[document.scripts.length - 1].getAttribute("src", 4)

ie6/7的getAttribute支持第二个参数,设为4表示返回完整路径的url地址,详细参考msdn的getAttribute Method

结合Data URI 和 MHTML可以这样得到透明图片数据:

ImagePreview.TRANSPARENT = $$B.ie7 || $$B.ie6 ?
    "mhtml:" + document.scripts[document.scripts.length - 1].getAttribute("src", 4) + "!blankImage" :
    "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAA
AAALAAAAAABAAEAAAICRAEAOw==";

使用时要注意:
脚本必须单独另存为一个文件,作为mhtml需要的文件路径。
要自动获取完整路径需要用script标签链接文件。

(责任编辑:IT教学网)

更多

推荐Javascript/Ajax文章