从这篇博文:
提前预加载组件有利于性能。有几种方法可以做到这一点。但即使是最干净的解决方案(打开一个 iframe 并在那里发疯)也是有代价的——iframe 的价格以及解析和执行预加载的 CSS 和 JavaScript 的价格。如果您预加载的脚本假定它加载在与预加载不同的页面中,那么潜在的 JavaScript 错误的风险也相对较高。
经过一些试验和很多错误,我想我想出了一些可以跨浏览器工作的东西:
- 在 IE 中用于
new Image().src
预加载所有组件类型
- 在所有其他浏览器中使用动态
<object>
标签
在这个例子中,我假设页面在加载下一页需要的一些组件之后预取。组件是一个 CSS、一个 JS 和一个 PNG(精灵)。
window.onload = function () {
var i = 0,
max = 0,
o = null,
// list of stuff to preload
preload = [
'http://tools.w3clubs.com/pagr2/<?php echo $id; ?>.sleep.expires.png',
'http://tools.w3clubs.com/pagr2/<?php echo $id; ?>.sleep.expires.js',
'http://tools.w3clubs.com/pagr2/<?php echo $id; ?>.sleep.expires.css'
],
isIE = navigator.appName.indexOf('Microsoft') === 0;
for (i = 0, max = preload.length; i < max; i += 1) {
if (isIE) {
new Image().src = preload[i];
continue;
}
o = document.createElement('object');
o.data = preload[i];
// IE stuff, otherwise 0x0 is OK
//o.width = 1;
//o.height = 1;
//o.style.visibility = "hidden";
//o.type = "text/plain"; // IE
o.width = 0;
o.height = 0;
// only FF appends to the head
// all others require body
document.body.appendChild(o);
}
};
有关详细信息,请参阅帖子。
编辑:查看那篇文章的评论,有人提到了这个链接,它谈到了new Image()
IE 和其他浏览器中的 preload 方法的问题。这是一段摘录:
当 IE 遇到 IMG 标签时,它会创建一个图像对象并将下载请求分配给它。当数据从图像下载到达时,它被输入浏览器的图像解码器。如果您向它们提供纯文本,解码器将拒绝数据格式错误,这似乎是合理的,因为它们不可能使用这些数据。当解码器将数据拒绝为“不可能是图像”时,图像对象将中止其处理。作为该中止的一部分,如果下载尚未完成,它也被中止。
这解释了 OP 在下面的评论中提到的行为(IE9 只下载 4KB 的文件)。
似乎您唯一可靠的跨浏览器选项可能是使用 Ajax ......