2013-04-25 87 views
0

我有4張圖片具有分頁的幻燈片,現在我希望他們能表現出一個接一個的循環,爲循環我有這樣的代碼:如何使用的setTimeout的循環功能

function myfn(interaltime) { 
    setTimeout('$("#picgallery_pagging li:eq(0)").trigger("click")', 0); 
    setTimeout('$("#picgallery_pagging li:eq(1)").trigger("click")', interaltime); 
    setTimeout('$("#picgallery_pagging li:eq(2)").trigger("click")', interaltime*2); 
    setTimeout('$("#picgallery_pagging li:eq(3)").trigger("click")', interaltime*3); 
    setTimeout('myfn('+interaltime+')',interaltime*4); 
    }; 
    myfn(3000); 

我的問題:它不能正常工作,只運行一次,interaltime變量在第二輪中爲空

分頁中的每個按鈕都會運行我的自定義函數效果以顯示圖片,因爲您看到我必須觸發點擊在我的分頁上的每個按鈕上的功能(我不知道如何使用jQuery中的延遲與我自己的功能)

note:我在控制檯日誌中檢查了間隔時間變量,並且在第二回閤中它是空的!但我不知道如何解決它!
編輯:我用的setInterval但仍intercaltime變量是空的第二自命

+0

嘗試setInterval而不是setTimeout – bingjie2680 2013-04-25 18:13:56

+0

如果你正在循環,你確定不想使用setInterval嗎? – BBagi 2013-04-25 18:14:04

+0

這不起作用; setTimeout不會讓它等待之後的代碼。它將等待X毫秒的時間來執行函數的內部函數。所以他們都會同時發生。 – 2013-04-25 18:14:15

回答

2

你傳遞字符串setTimeout - 這是不是最好的做法,可以是徹頭徹尾的不可靠。

試試這個,而是:

function autoclick($el, delay) { 
    var i = 0, n = $el.length; 
    (function loop() { 
     $el.eq(i).trigger('click'); // do your thang 
     i = (i + 1) % n;    // increment and reset (if required) 
     setTimeout(loop, delay);  // loop "recursively" 
    })();        // invoke immediately 
} 

autoclick($('#picgallery_pagging li'), 1000); 

它消除了你的代碼的重複,並安排到自己一遍又一遍地呼籲每個單個元素,而不是整批中的四個。

該調用不是真的是遞歸,即使它看起來像它,因爲它實際上是瀏覽器的事件循環,它負責反覆調度函數調用。

演示在http://jsfiddle.net/alnitak/PfmVt/

+0

謝謝Alntiak – PersianMan 2013-04-25 18:27:44

+0

@PersianMan爲了提高效率,我只是稍微更新了代碼。它現在也會自動迭代您在圖庫中擁有的許多條目。 – Alnitak 2013-04-25 18:28:15

+0

我也檢查過。你的編碼知識和速度是驚人的 – PersianMan 2013-04-25 18:32:13

0

選項之一會是這樣:

function myfn(interaltime) { 
    function wrapper(){ 
     do_stuff(); 
     setTimeout(wrapper, interaltime); 
    } 
    setTimeout(wrapper, 0); 
} 

你基本上設置超時一次又一次地運行相同的功能。這是一個非常簡單的示例,甚至沒有試圖提供取消循環的方法。另外請注意,它不是以任何方式遞歸調用,所以你不會遇到一個stackoverflow問題。

更簡單的選擇是使用的setInterval:

function myfn(interaltime) { 
    return setInterval(do_stuff, intervaltime); 
} 

這樣你就可以取消循環,像

var loop = myfn(100); 
//somewhere later 
clearInterval(loop); 
0

嘗試:

setTimeout(function() { 
       $("#picgallery_pagging li:eq(0)").trigger("click"); 
      }, 0); 

代替

setTimeout('$("#picgallery_pagging li:eq(0)").trigger("click")', 0); 

並重復所有其他setTimeouts。本質上,使用setTimeout的匿名函數