所以我最近开发了一个网站,问题是每个页面的背景都是图像,因此,在较慢的连接上(某些目标受众的情况),图像会逐渐加载。已下载,要解决此问题,我正在尝试制作一个执行以下操作的预加载页面:
加载完成后,将用户重定向到请求的页面
<script type="text/javascript">
<!--//--><![CDATA[//><!--
var images = new Array()
var count=0;
function preload() {
for (i = 0; i < preload.arguments.length; i++) {
images[i] = new Image()
images[i].src = preload.arguments[i]
}
if(count==4) {
window.location = "index.html";
}
}
preload(
"backgrounds/bg1.jpg",
"backgrounds/bg2.jpg",
"backgrounds/bg3.jpg",
"backgrounds/bg4.jpg"
)
//--><!]]>
问题是它直接重定向(我假设它只是开始下载图像然后直接将一个添加到计数器变量,快速达到4并且不给图像下载时间。
任何想法如何让我在图像下载完成时发出信号,或者只在下载完图像后执行重定向?
答案 0 :(得分:3)
您需要等待load
事件。这很简单:
function preload(images, timeout, cb) {
var cbFired = false,
remaining = images.length,
timer = null;
function imageDone() {
remaining--;
if(remaining === 0 && !cbFired) {
cbFired = true;
clearTimeout(timer);
cb();
}
}
function timerExpired() {
if(cbFired)
return;
cbFired = true;
cb();
}
for(var i = 0; i < images.length; i++) {
var img = new Image();
img.onload = imageDone;
img.onerror = imageDone;
img.src = images[i];
}
timer = setTimeout(timerExpired, timeout);
}
您需要检查一些内容,以免用户卡住:
load
和error
,以便在图片无法加载时页面不会卡住。i
是一个全局变量(没有var
声明)。以下是如何使用它:
var images = [ "backgrounds/bg1.jpg",
"backgrounds/bg2.jpg",
"backgrounds/bg3.jpg",
"backgrounds/bg4.jpg"];
preload(images, 10000 /* 10s */, function () {
window.location = 'next_page';
});
答案 1 :(得分:1)
修改你的预加载器,使它绑定到Image对象的“onload”事件,当所有回调被触发时,它会重定向(下面未经测试的示例代码):
var images = new Array()
var count = 0;
function preload() {
var numImages = preload.arguments.length
for (i = 0; i < numImages; i++) {
images[i] = new Image();
images[i].onload = doneLoading; // See function below.
images[i].src = preload.arguments[i];
}
function doneLoading() {
if (++count >= numImages) {
window.location = "index.html";
}
}
}
preload(
"backgrounds/bg1.jpg",
"backgrounds/bg2.jpg",
"backgrounds/bg3.jpg",
"backgrounds/bg4.jpg"
)