网络编程
位置:首页>> 网络编程>> JavaScript>> Data URI小试 —— 在旺旺点灯(JS)上的应用

Data URI小试 —— 在旺旺点灯(JS)上的应用

作者:云谦  发布时间:2009-10-30 18:28:00 

标签:旺旺,点灯,data,uri,

本文重在实践和测试,如果你还不了解Data URI,推荐先阅读秦歌的Data URI 和 MHTML

旺旺点灯(JS)实践经过:

因为要对SRP(Search Result Page)页面进行优化,我们想尽方法节约每一个连接,然后想到了Data URI,ok,先在旺旺点灯里尝试下。

我们都知道,要在实际应用中用上Data URI,必须针对IE6[1]/7使用MHTML。

第一次尝试的代码如下:DEMO

background:url({data uri});*background:url({mhtml}); // IE6/7

似乎没有问题,但如果你用的是IE8,请在IE8兼容模式里看下,你会发现旺旺图片并没有显示出来。

随后测试了多位同事的IE8,找到了原因:

IE8兼容模式下支持IE7的css hack(如 *),但并不支持mhtml,而我上面的写法使得支持 * hack的浏览器都使用了mhtml。

并且,非常郁闷的是,光IE8就有以下情况:

  • 1. 8.0.6001.18702IC,应该是一个早期的版本,支持data-uri和mhtml,没得说。[2]

  • 2. 8.0.7600.16385,有的默认打开是IE8 Mode,有的默认打开是IE8 Compat Mode,就是这个IE8 Compat Mode使得上面的写法产生了bug。

好了,因为是在JS中使用,解决方案也很简单,就是用JS判断下兼容模式,让IE8 Compat Mode也使用data-uri。

最后代码如下:

var compat_mode =  /trident\/\d/i.test(navigator.userAgent),  css_text = 'background:url({data uri});' + compat_mode ? '' : '*background:url({mhtml});';

DEMO

淘宝线上试点应用:SRP


最小文件尝试:将旺旺的css sprite进行各种拆分

图片大小为11.773K

我将图片进行了3种拆分(拆分工具:Firework),上下、左右、上下左右,试着寻找最小文件的组合规律,可惜暂时没有收获。


原始大小压缩后大小gzip后大小
一个大图30.9K30.8K12.139K
左右(两张图片)35.5K35.5K8.094K
上下(三张图片)30.2K30.1K9.960K
上下左右(6个小图标)38.4K38.3K10.811K

可以看到,如果按最优的方法(左右组合)来使用data-uri替换sprite,可节约3.7K和一个连接数。


CSS应用展望:

要在CSS里进行应用,可能还得先解决以下问题:

  • 1. 上面描述的IE8 Compat Mode,CSS中没有对应的hack方法

  • 2. 经测试,发现IE下同一个css文件加不同的时间戳,会被下载两次。
    而淘宝的页面时通过时间戳来控制文件缓存的,这意味着每次更改CSS文件都要保持”页面里的CSS路径”和”MHTML中引用”的完全一致。

  • 3. YUI Compressor的CSS压缩问题
    打开http://a.tbcdn.cn/sys/wangwang/tbww_v1.1_srp.js,我们会发现MHTML是写在注释里的,所以文件上线时需要保留这部分注释信息。
    通过YUI Compressor压缩JS的时候可以用 /*! ….. */ 这样的方法保留注释,而在压缩CSS的时候此方法无效。

对应的解决方案如下:

  • 1. 通过JS给html元素增加class=’compat-mode’,然后CSS代码如下

    .compat-mode .data-uri-cls, .data-uri-cls { background:url({data-uri});}.data-uri-cls { *background:url(mhtml);}

  • 2. 发现秦歌文章中的有一个CSS Expression的解决方案 [3]

  • 3. 等待YUI Compressor调整或利用ant先提取注释压缩完再加回去


参考文章

秦歌, http://dancewithnet.com/2009/08/15/data-uri-mhtml/

克军, http://hikejun.com/demo/css/data-uri.html

Wikipedia, http://en.wikipedia.org/wiki/Data_URI_scheme

Msdn, http://msdn.microsoft.com/en-us/library/cc848897%28VS.85%29.aspx

Stoyan, http://www.phpied.com/data-urls-what-are-they-and-how-to-use/, http://www.phpied.com/mhtml-when-you-need-data-uris-in-ie7-and-under/

R Reid, Detecting IE 8 Compatibility Modes with Javascript


[1] IE6有个可以忽视的bug:打开mhtml格式的图片,再选中地址栏,按回车,浏览器崩溃。

[2] xp下载过来的IE8好像都是这个版本。

[3] 请注意,使用YUI Compressor压缩CSS Expression时可能会出错,Expression越复杂,出错几率越大。

0
投稿

猜你喜欢

  • 最近有网友在留言板里问到jRaiser和jQuery的冲突问题,特此写一篇文章进行解释。冲突的根源众所周知,jQuery是通过一个全局变量$
  • 因为神奇的中文有时也是会遇到国外同学都不知道原因导致一些神奇滴问题,所以要用更神奇的英文来解决问题。Mac OS的一些:华文细黑:STHei
  • 我们经常会遇到多重查询问题,而长长的SQL语句往往让人丈二和尚摸不着头脑。特别是客户端部分填入查询条件时,如用普通方法将更是难上加难。以下巧
  • 当元素设置浮动(float)后会被移出文档流,相信大家都会经常遇到这样的问题。这问题的解决办法有N种之多,因为每种浏览器对CSS的解析各异,
  • 日历功能在个人博客网站及一些任务类网站都有广泛的应用,当然,在一些通用网站的后台也不乏这些日历功能的综合应用,所以,一个结构合理、代码清晰的
  • 在html里的每一个标签都有其自身的意义,而H标签作为标题标签,它的意义更是至关重要。对于H标签的用法特别是h1的用法一直是个争议的问题,也
  • asp之家注:长文章分页算是asp编程中一个比较经典单位问题,怎么分页,什么时候分页.方法挺多,有的是人为的加入分页标志,有的是程序自动加分
  • 我和朋友都建了一个电子商务网站,大量的访问,频繁地建立和中断数据库连接,导致Web 数据库应用程序降低了数据库服务器的性能。但最近,朋友使用
  • 随着因特网的发展,在网络环境中,数据库应用渐渐向操作简单、功能实用的方向发展。本文介绍如何利用ASP技术实现对数据库进行在线维护的方法,并给
  • 这个函数是前几年刚流行小偷程序的时候,偶写来用于小偷程序中截取代码的;可能有些朋友在我以前的代码中看见过了,但没有写用法,现在把调用方法及使
  • js模拟随机抽奖程序代码!相关文章推荐:随机6+1选号码摇奖程序 <html><title>模拟抽奖-asp之家&l
  • 首先恭喜月影,当然希望好书大卖!原文提供了样章下载1.1M,pdf格式的。如果大家想下载可以访问源地址:http://bbs.51js.co
  • ASP+Access数据库的18条安全法则:1.首先,我们需要过滤所有客户端提交的内容,其中包括?id=N一类,另外还有提交的html代码中
  • 斜角导航条看上去立体感比较强,但实现起来比较麻烦;这是前几天写的一个测试代码,实现时,本来想用简单的图片加负数来实现;但GIF图片对半透明的
  • 示例:mysql> DELIMITER //mysql> CREATE PROCEDURE `statis`()  
  • 黑体是视觉设计师常用的一款字体,特别是针对广告的 Banner 等。根据 * 的相关介绍,有关黑体的定义可以认为:黑體与白体
  •  代码如下:--获取当前时间 Select getdate() --获取当前年月日 YY代表年,MM代表月,DD代表日,hh代表时
  •  你是否对获得MySQL数据库与表的最基本命令的实际操作感到十分头疼?如果是这样子的话,以下的文章将会给你相应的解决方案,以下的文
  • Insus.NET解决这个问题,只有创建另外一个表,将存储用户决定要跟踪的表,以及这个表中需要跟踪的字段。 还要创建另外一个表[Audit]
  • 因AJAX接受数据时服务器默认是采用UTF-8的编码形式进行传送,所以在很多GB2312中文网页中应用AJAX回传数据经常会发生中文乱码。解
手机版 网络编程 asp之家 www.aspxhome.com