2013-02-08 166 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