【发布时间】:2011-06-12 04:53:16
【问题描述】:
注意:如果你是第一次阅读这篇文章,你可以直接跳到更新,因为它更准确地解决了问题。
所以我得到了一个网页。
在头部我有一个 CSS 背景图像:
<style>
#foo { background-image:url(foo.gif); }
</style>
在页面底部我加载了我的脚本:
<script src="jquery.js"></script>
<script src="analytics.js"></script>
由于脚本位于页面底部,而 CSS 位于页面顶部,我假设浏览器会首先加载图像。然而,情况似乎并非如此。
这是来自 Chrome 开发工具的截图:
http://www.vidasp.net/media/cssimg-vs-script.png
如您所见,图像在脚本之后加载。
(垂直的蓝线是 page load DOMContentLoaded 事件。巨大的 45ms 间隔是 Chrome 解析 jQuery 源代码的时间。)
现在,我的第一个问题是:
这是浏览器中的标准行为吗? CSS background-images 是否总是在页面上的所有脚本之后加载?
如果是,我如何确保这些图像在脚本之前加载?这个问题有简单方便的解决方案吗?
更新
我做了一个测试用例。这是 HTML 源代码:
<!DOCTYPE html>
<html>
<head>
<style> body { background-image: url(image1.jpg) } </style>
</head>
<body>
<div> <img src="image2.jpg"> </div>
<script src="http://ajax.googleapis.com/ajax/.../jquery.min.js"></script>
<script src="http://vidasp.net/js/tablesorter.js"></script>
</body>
</html>
如您所见,我有一个 CSS 背景图像、一个常规图像和两个脚本。现在结果:
互联网探索者(9 测试版)
http://www.vidasp.net/media/loadorder-results/ie2.png
http://www.vidasp.net/media/loadorder-results/ie1.png
Internet Explorer 首先请求常规图像,然后是两个脚本,最后是 CSS 图像。
火狐 (3.6)
http://www.vidasp.net/media/loadorder-results/firefox2.png
http://www.vidasp.net/media/loadorder-results/firefox1.png
Firefox 做得对。所有资源都按照它们在 HTML 源代码中出现的顺序被请求。
Chrome(最新稳定版)
http://www.vidasp.net/media/loadorder-results/chrome2.png
http://www.vidasp.net/media/loadorder-results/chrome1.png
Chrome 演示了让我首先写这个问题的问题。在图像之前请求脚本。
歌剧(11)
http://www.vidasp.net/media/loadorder-results/opera1.png
http://www.vidasp.net/media/loadorder-results/opera2.png
与 Firefox 一样,Opera 也做得很好。 :D
总结一下:
- Firefox 和 Opera 正在请求源代码中显示的资源。
例外所以这条规则:
- Internet Explorer 最后请求 CSS 背景图像
- Chrome 会在图像之前请求脚本,即使脚本稍后出现在源代码中也是如此
既然我已经提出了问题,让我继续我的问题:
如何让 IE 和 Chrome 请求 脚本之前的图像?
【问题讨论】:
-
"这是浏览器的标准行为吗?"是的,对于 css background img on :hover 来说更糟
-
如果可以的话,我想问一个反问:为什么以特定顺序加载脚本/图像很重要?大多数情况下,我很好奇更改顺序是否可以为您解决根本问题。
-
@zzzzBov 我希望尽快请求图像,因为这意味着访问者会更快地看到它们。显然,让图像尽快出现在屏幕上是一件好事。
-
Vidas,如果问题太大,您可以添加一个简短的脚本以在文档加载时加载脚本。
< 1s加载时间足够快恕我直言。人们只会看到他们正在寻找的东西。 -
@zzzzBov 是的,我会尝试的。请注意,在这种情况下,延迟为 45 毫秒。但在其他情况下,它可能会高得多。但是,不管延迟如何,通常最好先请求图像,这就是我想要实现的跨浏览器。
标签: javascript css internet-explorer browser google-chrome