script type="text/javascript">
window.onload = function(){
var container = document.getElementById('container');
var list = document.getElementById('list');
var buttons = document.getElementById('buttons').getElementsByTagName('span');
var prev = document.getElementById('prev');
var next = document.getElementById('next');
var index = 1;
var timer;
var animated = false;
function animate(offset){
animated = true;
var time = 300;
var interval = 10;
var speed = offset/(time/interval);
var newLeft = parseInt(list.style.left)+offset;
function go(){
if((speed < 0 && parseInt(list.style.left) > newLeft) || (speed > 0 && parseInt(list.style.left) < newLeft)){
list.style.left = parseInt(list.style.left) + speed + "px";
setTimeout(go,interval);
}
else{
animated = false;
list.style.left = newLeft + 'px';
if (newLeft >-600){
list.style.left = -3000 + 'px';
}
if (newLeft <-3000){
list.style.left = -600 + 'px';
}
}
}
go();
}
function play(){
timer = setInterval(function(){
next.onclick();
},2000);
}
function stop(){
clearInterval(timer);
}
function buttonsShow(){
for(var i=0; i<buttons.length; i++){
if (buttons[i].className == "on"){
buttons[i].className = "";
}
}
buttons[index-1].className = "on";
}
prev.onclick = function(){
index -=1;
if (index < 1){
index = 5;
}
buttonsShow();
if(!animated){
animate(600);
}
}
next.onclick = function(){
index +=1;
if(index > 5){
index =1;
}
buttonsShow();
if(!animated){
animate(-600);
}
}
for(var i=0; i<buttons.length; i++){
buttons[i].onclick = function(){
if(this.className == "on"){
return;
}
var clickIndex = parseInt(this.getAttribute('index'));
var offset = 600*(clickIndex - index);
animate(offset);
index = clickIndex;
buttonsShow();
}
}
container.onmouseover = stop;
container.onmouseout = play;
play();
}
</script>
之前写了一个轮播图,做完发现当我去浏览别的页面再返回时,轮播图会一直自动轮播,轮播的时间是我离开的时间,比如我离开了20s,内置2秒轮播一次,它就会快读轮播10次。而且我在他轮播时如果快速点击2次下一张图,他可能就会出现卡图的现象,就是两张图片各占了轮播图界面的一半。
针对这个问题,优化步骤是在全局变量中声明一个变量。我用的是animated=false。在animate函数中设置animated=true。如果当轮播图到达最后的位置时,设置animated为false。并且在在切换图片时,在animate(600)和animate(-600)前加一句if(!animated)。
解释:首先设置一个animated变量,当轮播图达到最后位置时,animated为false。所以当我快速点击2次下一张的时候,由于轮播图还没达到最后位置,所以animated为true。所以就算点击下一张,由于在animate(-600)前加一句if(!animated),if(!animated)为false,所以并不会执行。
而且当我去浏览别的页面时,由于我在它内置时间2s前离开,animated始终为true,它会数到2s,但是不会轮播,但是当你返回轮播图页面的时候,会迅速直接轮播下一张图片,但是这样的话就不会差很多。
PS:上面是相关js代码。