2012-09-29 20 views
0

我有這樣的代碼,但只執行一次的工作...的setTimeout代碼不使用jQuery

$('.' + container).hover(function() { 
     t = setTimeout(function(elem){ 
      //this should be executed as long as I hover, 
      //with interval declared in viewSpped variable 
      $(elem).find('img').first().appendTo('.' + container).fadeOut(500); 
      $(elem).find('img').first().fadeIn(800);  

     }(this), viewSpeed); 


    }... 

任何想法,我做錯了嗎?謝謝!

+0

您正在執行該函數,而不是將它傳遞給setTimeout。在函數聲明之後放下'(this)'。 –

+0

看到一個簡單的功能可以被扭曲和破壞,然後「譴責」別的東西的不同方式總是有趣的。 –

回答

1

setTimeout只調用一次回調,這很正常。

如果您希望定期執行您的功能,您可能需要setInterval

而且,順便說一句,有一個在您的代碼另一個錯誤:你可能想

t = setInterval(function(elem){ 
     //this should be executed as long as I hover, 
     //with interval declared in viewSpped variable 
     $(elem).find('img').first().appendTo('.' + container).fadeOut(500); 
     $(elem).find('img').first().fadeIn(800);  
    }, viewSpeed, this); 

通過setIntervalsetTimeout傳遞給回調的參數是時間之後。

或者,更兼容(請注意,我還提供了鏈接給出了IE的解決方法):

var $elem = $(this); 
t = setInterval(function(){ 
        $elem.find('img').first().appendTo('.' + container).fadeOut(500); 
        $elem.find('img').first().fadeIn(800);     
}, viewSpeed); 
+0

儘管最好在循環中使用setTimeout,所以我不鼓勵使用setInterval – jeremy

+1

@Nile - 這取決於,但說「setInterval'應該在循環中不應該有點不協調」?我的意思是,還有什麼'setInterval'呢? –

+0

您能否介紹一下$ elem中的$?這個對我來說非常合適,非常感謝你的答案...... – Emkey

3

setTimeout調用其回調不帶參數。因此elem不會傳遞給您的回調。如果您正在嘗試執行自我調用功能,那麼您所做的只是立即調用您的函數,而不是將回調傳遞給setTimeout()

我不知道您的期望elem是什麼,但如果你希望它是在徘徊的項目,你會是這樣做的:

$('.' + container).hover(function() { 
    var self = $(this); 
    t = setTimeout(function(){ 
     //this should be executed as long as I hover, 
     //with interval declared in viewSpped variable 
     self.find('img').first().appendTo('.' + container).fadeOut(500); 
     self.find('img').first().fadeIn(800);  

    }, viewSpeed); 
}... 
+0

你可以提供setTimeout參數給回調:https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout –

+1

@dystroy - 是的,但只在某些瀏覽器(不在IE中不起作用)。用可在回調中引用的變量解決問題更安全。 – jfriend00

+0

@dystroy:這不是普遍適用的。 – Ryan

1

你立即調用該函數而不是將其用作回調(無論如何,因爲您需要傳遞一個參數,這並不起作用),而且我認爲您的意思也是setInterval

var elem = $(this); 
var container = $('.' + container); 

t = setInterval(function() { 
     elem.find('img').first().appendTo(container).fadeOut(500); 
     elem.find('img').first().fadeIn(800); 
    }, viewSpeed); 
+0

在這一個上有未被捕獲的語法錯誤... – Emkey

+0

@Emkey:...在哪裏? – Ryan

+0

我修正了它,只要我懸停,但appendTo看起來像不工作... – Emkey