三月, 2010的档案

不可小视的图片空路径

什么是图片“空路径”

空路径(empty image src)就是创建一个不指定资源地址的DOM元素,最常见的是img标签,当src为空时,这时就说该图片是空路径。

什么情况下会出现空路径

有两种情况会产生空路径元素:

  • 直接在HTML中的明文img标签,src为空。最常见的一个场景是,图片地址是保存在数据库中,当用服务器端语言从数据库中查询并输出,遇到数据库中图片地址字段为空。
    HTML:
    1. <img src="">

  • 使用Javascript动态创建的Image,创建后的Image对象的src赋空值。
    JAVASCRIPT:
    1. var img = new Image();
    2. img.src = "";

哪些标签可能导致空路径

  • <img src="">
  • <iframe src="">
  • <script src="">
  • <input type="image" src="">
  • <embed src="">
  • <object data="">

空路径有什么危害

危害有两点:

  • 增加页面的请求数。

    即使是空图片,浏览器也会发起一个http连接,不同浏览器对不同的空路径元素表现不一样,下表列出了各浏览器遇上空路径元素时发起的请求数。

      图片=1 图片=2 图片>2 iframe css js image-input embed/object
    IE6 1 1 1 0 0 0 1 0
    FF3.0 1 2 2 0 0 0(报错) 0 0
    FF3.5 0 0 0 0 0 0 0 0
    Chrome3.0 1 2 2 0 1 1 1 0
    Safari4.0 1 2 2 0 1 1 1 0
    Opera10.10 0 0 0 0 0 0 0 0

    (Chrome,Safari,Opera还会请求/favicon.ico,即使页面没有指定favicon)可以看出IE6,Chrome,Safari,以及3.0以下FireFox都会不同程度的对空路径发起请求。Opera和3.5以上Firefox已经很好的处理了空路径问题。

    浏览器对空路径元素请求的目标地址也不一样,IE是请求网页所在的目录,其他浏览器是请求网页本身。例如http://www.sina.com.cn/test/1.php中包含空路径元素,IE发现空路径元素时会请求http://www.sina.com.cn/test/,而其他浏览器是请求http://www.sina.com.cn/test/1.php。

  • 成倍增加服务器压力。

    从上面的分析可能你已经看出了,浏览器增加的这些请求会定位到网站的其他页面(或者本页)上,这会导致网站服务器对这些本来无谓的请求做出响应,当网站流量很小(PV=100)时,也许增加的这些额外请求算不上什么,但如果网站流量很大,像新浪首页这种日PV上亿级的网页,这些额外的流量将是致命的,说它们会导致服务器瘫痪那绝不是危言耸听。

详情 »

使用postMessage实现setTimeout

setTimeout经常被用来做网页上的定时器,允许为它指定一个毫秒数作为间隔执行的时间。当被启动的程序需要在非常短的时间内运行,我们就会给她指定一个很小的时间数,或者需要马上执行的话,我们甚至把这个毫秒数设置为0,但事实上,setTimeout有一个最小执行时间,当指定的时间小于该时间时,浏览器会用最小允许的时间作为setTimeout的时间间隔,也就是说即使我们把setTimeout的毫秒数设置为0,被调用的程序也没有马上启动。

这个最小的时间间隔是多少呢?这和浏览器及操作系统有关。在John Resig的新书《Javascript忍者的秘密》一书中提到

Browsers all have a 10ms minimum delay on OSX and a(approximately) 15ms delay on Windows.(在苹果机上的最小时间间隔是10毫秒,在Windows系统上的最小时间间隔大约是15毫秒)

,另外,MDC中关于setTimeout的介绍中也提到,Firefox中定义的最小时间间隔(DOM_MIN_TIMEOUT_VALUE)是10毫秒,HTML5定义的最小时间间隔是4毫秒。既然规范都是这样写的,那看来使用setTimeout是没办法再把这个最小时间间隔缩短了,那有没有其他“曲线救国”的办法呢? 详情 »