小心页面中引用了空的外部资源

看到NCZ的这篇文章: Empty image src can destroy your site, 受益不少, 在这里总结一下!

一. 测试环境

浏览器: IE6+, FF 3.5.5, Opera 10.00 Beta 2, Chrome 4.0.249.11, Safari 4.0.3

OS: winXP 32

二. 空图像

当img元素的src属性被设置为空字符串时, 空图像就产生了, 它有两种形式:

1. html形式
<img src="" />
2. js形式
var oImg = new Image(); oImg.src="";

三. 浏览器对空图像的处理态度

1. IE6,7,8: 空图像会向当前页面所在的目录发起一次请求, 如http://www.mytcer.com/demo/test.html中有一个空图像, 那么它会请求http://www.mytcer.com/demo/;

2. Safari 4(据作者测试, FF3及其之前版本也有这个问题): 空图像会向当前页面发起一个请求, 如http://www.mytcer.com/demo/test.html中有一个空图像, 那么它会请求http://www.mytcer.com/demo/test.html;

3. FF 3.5, Chrome 4, Opera 10: 他们会忽略空图像, 不会产生请求.

4. 我的测试截图:
empty_image

三. 空图像导致的问题

它至少会导致两个问题:
1. 会产生一个无效的请求, 比如在IE下;
2. 在Safari4, FF3中, 会产生一些额外的请求: 由于在这些浏览器下, 空图像会将当前页面请求一次, 这等于是对同一个页面请求了两次. 对于一些pv较小的站点来说(比如我的blog), 这可能不会产生大的影响, 但对于那些pv很高的站点(比如淘宝首页), 这无疑会给服务器带来很大的压力.

四. 其他可引用外部资源的标签, 情况如何呢?

1. link

结论: 只有Opera会请求域名指向的根目录, 详情如下图:

empty_link

2. script

结论: 只有IE不会产生多余的请求; FF, Chrome, Opera会请求域名指向的根目录; Safari会请求当前页面, 详情如下图:

empty_script

3. iframe

结论: IE和FF不会产生多余的请求; Chrome, Safari, Opera会请求域名指向的根目录, 详情如下图:

empty_iframe

input(图像按钮)

a. 结论: 所有浏览器都会产生一次请求; IE, Safari会请求当前页面; FF, Chorme, Opera会请求域名指向的根目录, 详情如下图:

empty_input

, ,

Comments

黑眼刀豆 at 2009年12月26日 10:12 下午

/favicon.ico应该是请求网站图标,一般用于在书签中显示,
不是空属性引起的

Author comment by Tcer at 2009年12月27日 8:21 下午

@黑眼刀豆, 之前, 我也想到这个, 后来做了一下确认: 如果去掉空图像, 则不会请求/favicon.ico.

Leave a comment!