2012-01-28 54 views
3

我試圖在heartColor(e)函數開始之前創建6秒的延遲,函數將繼續循環。我不明白爲什麼它開始了這個功能,而不是等待它應該的6秒,我做錯了什麼?延遲6秒鐘,然後開始一個函數,它會自行循環,很小,不工作,爲什麼?

function heartColor(e) { 
    e.animate({ 
     color: '#7ea0dd' 
    }, 1000).animate({ 
     color: '#986db9' 
    }, 1000).animate({ 
     color: '#9fc54e' 
    }, 1000, function(){ 
     heartColor(e) 
    }) 
} 

$('.something').hover(function(){ 
    setTimeout(heartColor($(this)), 6000); 
}) 

回答

9

setTimeout()功能預計其第一個參數是一個函數參考(或字符串,但不建議有以下幾個原因)。您沒有將它傳遞給函數引用,您正在調用heartColor()函數並將結果傳遞給setTimeout()。所以函數立即執行,然後在6秒後沒有任何反應,因爲返回值是未定義的,所以setTimeout()沒有任何用處。

試試這個:

$('.something').hover(function(){ 
    var $this = $(this); 
    setTimeout(function() { 
     heartColor($this); 
    }, 6000); 
}) 

我已經包含了一個匿名函數作爲參數傳遞給setTimeout的原因是,你對heartColor()調用需要通過傳遞一個參數。如果它沒有任何參數,你可以這樣做:

setTimeout(heartColor, 6000); 

注有heartColor後沒有括號 - 即得到一個參考作用沒有調用它,以便以後setTimeout爲您調用它。但是您無法同時獲得對該函數的參考並提供參數,因此您需要將調用包裝到另一個函數中。你可以這樣做:

var $this = $(this); 
function callHeartColor() { 
    heartColor($this); 
} 
setTimeout(callHeartColor, 6000); 

我最初的答案與匿名函數是一種簡短的手和(大多數人發現它)更方便。

我創建變量$this的原因是因爲this關鍵字在JavaScript中的作用方式,這取決於函數的調用方式。如果你只是說在heartColor($(this))內部的匿名函數(或callHeartColor()函數)this不會被元素懸停。

+1

+1了詳細的解答 – 2012-01-28 03:20:09

+0

只是出於好奇,爲什麼不'的setTimeout(heartColor,6000,$(本));'? – WesleyJohnson 2012-01-28 03:28:12

+2

@WesleyJohnson - 因爲,雖然方便,但它在IE中不起作用。 – nnnnnn 2012-01-28 03:33:00

1

你想這樣的:

$('.something').hover(function(){ 
    setTimeout(function() {heartColor($(this));}, 6000); 
}) 
2

您正在調用函數heartColor而不是將其作爲參數傳遞。你要做的:

$('.something').hover(function(){ 
    setTimeout(function(){heartColor($(this))}, 6000); 
})