Data URI

Data URI 是由 RFC 2397 定义的一种把小文件直接嵌入文档的方案。通过如下语法就可以把小文件变成指定编码直接嵌入到页面中:

data:[][;base64],

MIME-type:指定嵌入数据的 MIME。其形式是[type]/[subtype]; parameter,比如png图片对应的MIME是image/png。parameter可以用來指定附加的信息,更多情況下是用于指定text/plain和text/htm等的文字编码方式的charset参数。默认是text/plain;charset=US-ASCII。

base64:声明后面的数据的编码是base64的,否则数据必须要用百分号编码(即对内容进行urlencode)。

在上个世纪 HTML4.01引入了Data URI方案 ,到今天为止除了IE6和IE7之外,所有主流浏览器都支持,但IE8对Data URI的支持还是有限制的,只支持object(仅是图片时)、img、input type=image、link和CSS中的URL,且数据量不能大于32K。

优点:

减少HTTP请求数,没有了TCP连接消耗和同一域名下浏览器的并发数限制。

对于小文件会降低带宽。虽然编码后数据量会增加,但是却减少了http头,当http头的数据量大于文件编码的增量,那么就会降低带宽。

对于HTTPS站点,HTTPS和HTTP混用会有安全提示,而HTTPS相对于HTTP来讲开销要大更多,所以Data URI在这方面的优势更明显。

可以把整个多媒体页面保存为一个文件。

缺点:

无法被重复利用,同一个文档应用多次同一个内容,则需要重复多次,数据量大量增加,增加了下载时间。

无法被独自缓存,所以其包含文档重新加载时,它也要重新加载。

客户端需要重新解码和显示,增加了点消耗。

不支持数据压缩,base64编码会增加1/3大小,而urlencode后数据量会增加更多。

不利于安全软件的过滤,同时也存在一定的安全隐患。

MHTML

MHTML是MIME HTML (Multipurpose Internet Mail Extension HTML)的缩写,是由RFC 2557定义的把一个多媒体的页面所有内容都保存到同一个文档解决方案。这个方案是由微软提出从IE5.0开始支持,另外Opera9.0也开始支持,Safari可以把文件保存为.mht(MHTML文件的后缀)格式,但不支持显示它。

MHTML和Data URI还比较类似,有更强大的功能和更复杂的语法,并且没有Data URI中“无法被重复利用”的缺点,但MHTML使用起来不够灵活方便,比如对资源引用的URL在mht文件中可以是相对地址,否则必须是绝对地址。hedger在《Cross Browser Base64 Encoded Images Embedded in HTML》针对IE的解决方案使用的是相对路径就是因为声明了Content-type:message/rfc822使IE按照MHTML来解析,如果不修改Content-type则需要使用MHTML协议,这个时候必须使用绝对路径,如《MHTML – when you need data: URIs in IE7 and under》。

应用

Data URI和MHTML两者的配合可以完整的解决所有的主流浏览器,它们由于无法被缓存和重复利用的缺陷,所以并不适合直接在页面中使用,但在CSS和JavaScript文件中对图片适当地使用有非常大的优越性:

大大减少请求数,现在大型网站的CSS引用了大量的图片资源。

CSS和JavaScript都可以被缓存,间接的实现了数据的缓存。

利用CSS可以解决Data URI的重复利用问题

告别CSS Sprites,CSS Sprites的出现是为了减少请求数,但它除了带来在不确定情况下的异常外,CSS Sprites还需要人为的图片合并,即使有合并工具也依旧必须人为地在如何有效的拼图上耗费大量的时间,并带来维护的困难。当你遵循一定的设计原则后,你就可以完全抛弃CSS Sprites来编写CSS,最后使用工具在上传到服务器环节把图片转换成Data URI和MHTML,如《利用data-uri合并样式表和图片》中用python实现的工具,这可以节约大量的时间。

base64编码把图片文件增加了1/3,Data URI和MHTML同时使用相当于增加了2/3,但CSS和JavaScript可以使用gzip压缩,其可以节省2/3的数据量,所以使用gzip压缩后的最终数据量是(1 + 1/3) * 2 * (1/3) = 8/9,所以最终流量是减少的。

在CSS文件中使用应用MHTML时URL必须使用绝对路径,导致非常不灵活,所以可以考虑使用CSS expression来解决(DEMO),比如:

/*

http://old9.blogsome.com/2008/10/26/css-expression-reloaded/

http://dancewithnet.com/2009/07/27/get-right-url-from-html/

*/

*background-image:expression(function(ele){

ele.style.backgroundImage = 'url(mhtml:' +

document.getElementById('data-uri-css').getAttribute('href',4) +

'!03114501408821761.gif)';

}(this));

html data 协议,Data URI和MHTML完整解决所有浏览器相关推荐

  1. html打开浏览器uri,Data URI和MHTML完整解决所有浏览器

    Data URI Data URI 是由 RFC 2397 定义的一种把小文件直接嵌入文档的方案.通过如下语法就可以把小文件变成指定编码直接嵌入到页面中: data:[][;base64], MIME ...

  2. html打开浏览器uri,DataURI和MHTML完整解决所有浏览器

    Data URI Data URI 是由 RFC 2397 定义的一种把小文件直接嵌入文档的方案.通过如下语法就可以把小文件变成指定编码直接嵌入到页面中: data:[][;base64], MIME ...

  3. 初学Data URI和MHTML

    Data URI--也就是图片转成代码插入网页 Data URI Data URI是由RFC 2397定义的一种把小文件直接嵌入文档的方案.目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件 ...

  4. Data URI 和 MHTML

    Data URI Data URI是由RFC 2397定义的一种把小文件直接嵌入文档的方案.通过如下语法就可以把小文件变成指定编码直接嵌入到页面中: data:[<MIME-type>][ ...

  5. “background-image:url(data:image”data类型的Url格式简介

    所谓"data"类型的Url格式,是在RFC2397中 提出的,目的对于一些"小"的数据,可以在网页中直接嵌入,而不是从外部文件载入.例如对于img这个Tag, ...

  6. uri: lb://_数据URI,MHTML和IE7 / Win7 / Vista蓝调

    uri: lb:// 2010 update: Lo, the Web Performance Advent Calendar hath moved 2010年更新: Lo, Web Performa ...

  7. Data truncation: Data too long for column 'xxx' at row 1

    Data truncation: Data too long for column 'xxx' at row 1 完整的错误内容可能是下面这样的: 严重: Servlet.service() for ...

  8. 【Data truncation: Data too long for column ‘XXX at row 1 报错】

    问题描述 在进行提交修改数据的时候,出现Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncat ...

  9. 使用B站API:http://api.bilibili.com/x/space/upstat?mid=2026561407获取播放量、点赞量的返回报文中data数据缺失问题排查(已解决)

    背景 想要用ESP32获取一些b站上的数据粉丝量播放量等数据 获取粉丝数的API:http://api.bilibili.com/x/relation/stat?vmid=2026561407 获取播 ...

最新文章

  1. 【 karle 专栏 】Android 初探底层知识系列
  2. 放授权代码的php文件夹,自己的项目如果包含别人的开源代码,licence文件应放在哪里...
  3. linux中sed的基本用法,linux sed用法
  4. TikTok信息流广告怎么做才有效果?我从100个营销短视频中总结了这些方法
  5. C++ vector的用法
  6. 前端性能优化(PC版)
  7. Science发布基因组比对革新技术:泛基因组学映射工具Giraffe
  8. linux .i文件,Linux的文件I/O
  9. fgets,cin. getline被跳过
  10. 【Vue2.0】—ref属性(十四)
  11. 阿里面试题(含内推)
  12. 织梦++高级搜索php,织梦高级搜索页面advancedsearch.php调用自定义字段
  13. Java多线程Queue_Java多线程-BlockingQueue-ArrayBlockingQueue-LinkedBlockingQueue
  14. dojo——AMD(一、AMD中class使用)
  15. Linux搭建私人饥荒服务器(centos8-64位)
  16. python显示中文乱码_解决python中文乱码的方法
  17. 4 Values whose Sum is 0(4 个总和为 0 的值)c语言
  18. 苹果奖学金获得者:我的自学 iOS 开发历程
  19. 尝美食、看演出、听音乐…南亚风情第壹城非遗文化节继续等你玩
  20. 【海】沙滩啤酒win7桌面主题

热门文章

  1. 有没有可以把照片变成卡通版的app?
  2. 查找字符串中指定字符的位置c语言,C语言中查找字符在字符串中出现的位置的方法...
  3. 运行shell脚本报错:“syntax error near unexpected token 的解决方法”
  4. 成都信息工程大学计算机考研资料汇总
  5. 世界人工智能大会 | 你们只看到“双马”不在一个频道,却忽视了阿里平头哥和清微的结盟...
  6. 最新Fiora二次元聊天室宝塔源码+搭建教程/带后台
  7. Nuxt - Universal(SSR / SSG)/ Single Page App(渲染模式)
  8. 自己动手制作MacOS系统DMG安装镜像
  9. Mac必备的PPT神器:PPT2019最新完整版
  10. gis信息可视化之一Leaflet组件介绍