2013-02-08 78 views
1

我试过做一个自动滑块,虽然它看起来我的代码不工作 - 它或者崩溃浏览器或者它执行得非常快。while while循环功能的延迟

我一直在玩的是setTimeout,但它似乎并没有在while循环中工作。

var playSlider = true; 

if(playSlider) { 
    var i = $('#sliderwrapper ul li:visible').attr('data-number'); 
    var lengthLi = $('#sliderwrapper ul li').size(); 
    while(i<=lengthLi) { 
     var x = i + 1; 
     setTimeout(function(){ 
      $('#sliderwrapper ul li[data-number=' + i + ']').fadeOut(450); 
      $('#sliderwrapper ul li[data-number=' + x + ']').fadeIn(600); 
     }, 3000); 
     i++; 
    } 
} 

HTML:

<ul> 
    <li data-number="1" data-description="Buy now!"><img src="images/slider1.png" border="0"></li> 
    <li data-number="2" data-description="Buy later!"><img src="images/slider2.png" border="0"></li> 
    <li data-number="3"><img src="images/slider3.png" border="0"></li> 
    <li data-number="4"><img src="images/slider4.png" border="0"></li> 
    <li data-number="5"><img src="images/slider5.png" border="0"></li> 
    <li data-number="6"><img src="images/slider2.png" border="0"></li> 
    <li data-number="7"><img src="images/slider3.png" border="0"></li> 
    <li data-number="8"><img src="images/slider5.png" border="0"></li> 
    <li data-number="9"><img src="images/slider1.png" border="0"></li> 
</ul> 
+0

你不必在你的HTML标识'sliderwrapper'。 – 2013-02-08 14:11:51

回答

0

LIVE DEMO

var $li = $('#sliderwrapper ul li'); 
var N = $li.length; 
var C = 0 ; 
var intv ; 

$li.hide().eq(C).show(); 

function loop(){ 
    intv = setInterval(function(){ 
    $li.eq(++C % N).fadeTo(500,1).siblings().fadeTo(500,0); 
    },3000); 
} 
loop(); 

$('#sliderwrapper').on('mouseenter mouseleave', function(e){  
    var mEnt = e.type=='mouseenter' ? clearInterval(intv) : loop() ;  
}); 
+0

啊,好的。但是我需要暂停或恢复,我是否需要在函数调用中放下if语句? – 2013-02-08 14:44:21

+0

哦,对不起,我以为你会明白,因为我有一个 var playSlider = true; – 2013-02-08 14:48:06

+0

@ user2021893没问题! :)从问题和问题的解释不明显。看看我编辑的评论 – 2013-02-08 14:49:21

2

可以使用.delay( “3000”)把暂停JQuery的命令之间

+0

是的,我知道,但这不会在这种情况下,我相信.. – 2013-02-08 14:12:41

0

然后有点递归将帮助您:

function rec(){ 
    //your code and so on 
    setTimeout(function(){ 
     rec(); 
    },3000); 
} 
+1

这使得浏览器崩溃:/ – 2013-02-08 14:12:25

1

我改变了一些东西...

var playSlider = true; 
if(playSlider) { 
    var i = $('#sliderwrapper ul li:visible').attr('data-number'); 
    var lengthLi = $('#sliderwrapper ul li').length(); 
    while(i <= lengthLi) { 
     var x = i + 1; 
     setTimeout(function(){ 
      $('#sliderwrapper ul li[data-number=' + i + ']').fadeOut(450); 
      $('#sliderwrapper ul li[data-number=' + x + ']').fadeIn(600); 
     }, 3000 * i); 
     i++; 
    } 
} 

我将.size()更改为.length()来计算li元素(大小已过时),并且我将超时更改为3000 * i,否则它们将全部淡出并在3秒后同时出现。

+1

这应该有所斩断。 为了阐述答案:OP,你的代码似乎不工作,因为'setTimeout'是异步的。 'while'循环不会等待'setTimeout'函数运行,而是直接设置所有超时,然后3秒钟后,所有这些超时都会同时触发。 – Cerbrus 2013-02-08 14:20:58

+0

谢谢Cerbrus - 我应该提到setTimeout是非阻塞的。 – Archer 2013-02-08 14:26:10

+0

你仍然可以在下面进行编辑:P你已经有了我的+1。 – Cerbrus 2013-02-08 14:26:48