2012-02-10 47 views
1

好的,我錯過了一些基本的東西,我確定!但是,我的生活無法解決。setTimeout的jquery效果

方案

這是一個簡單的隱藏顯示菜單;

// Setup hover 
     var fadeDuration = 200; 
     var setDelay; 
     $level1Item.hover(function() { 
      $(this).addClass('hover').find('.level-2').fadeIn(fadeDuration); 
     }, function() { 
      $(this).removeClass('hover').find('.level-2').fadeOut(fadeDuration); 
     }); 

和正常工作......但下拉是相當大的,當它彈出都是很sexily有刺激性,當你的鼠標從頂部移動到屏幕的底部。

所以我想設置超時時間,並且清除它的鼠標了...

// Setup hover 
     var fadeDuration = 200; 
     var setDelay; 
     $level1Item.hover(function() { 
      setDelay = setTimeout("$(this).addClass('hover').find('.level-2').fadeIn(200)", 500); 
      //$(this).addClass('hover').find('.level-2').fadeIn(fadeDuration); 
     }, function() { 
      clearTimeout(setDelay); 
      $(this).removeClass('hover').find('.level-2').fadeOut(fadeDuration); 
     }); 

絕對沒有發生!我已經嘗試了超時函數中的警報,他們工作...最初的變量fadeDuration未定義,但數字停止控制檯錯誤。

回答

1

你不能在setTimeout -code使用this,因爲this取決於上下文。所以當超時激活時,this是不同的this ...壞英語,但希望它是有道理的。

另外,避免在定時器中使用字符串;改用功能。雖然你可以使用一個字符串,然後進行評估,如JavaScript,這是一般不好的形式比較簡單包裝相同的代碼在一個函數

var fadeDuration = 200; 
var setDelay; 
$level1Item.hover(function() { 
    var element = $(this); 
    setDelay = setTimeout(function() { 
     element.addClass('hover').find('.level-2').fadeIn(fadeDuration); 
    }, 500); 
}, function() { 
    clearTimeout(setDelay); 
    $(this).removeClass('hover').find('.level-2').fadeOut(fadeDuration); 
}); 
+0

乾杯Flambino ...非常有用的建議,使總體感。 我在setTimout()中試過了一個函數,但它是$(this)不工作,無法在我的腦海中傳遞,爲什麼它沒有在函數中打中,沒有想到要問$ (這個)。 – 2012-02-10 10:34:00

3

嘗試修改setTimeout呼叫使用匿名函數:

// Setup hover 
var fadeDuration = 200; 
var setDelay; 
var $item; 

$level1Item.hover(function() { 
    $item = $(this); 
    setDelay = setTimeout(function() { 
     $item.addClass('hover').find('.level-2').fadeIn(200) 
    }, 500); 
}, 
function() { 
    clearTimeout(setDelay); 
    $(this).removeClass('hover').find('.level-2').fadeOut(fadeDuration); 
}); 
+0

你爲什麼要劃定範圍'$ item'那麼遠了呢? – Quentin 2012-02-10 10:18:28

+0

謝謝Rory!就像我說的可能是一個根本的錯誤,雖然在懸停中聲明項目。 我在setTimout()中嘗試了一個函數,但它是$(this)不起作用。 – 2012-02-10 10:33:04

2

當你傳遞給setTimeout字符串是eval()版,thiswindow,而不是任何對象,你期待。

不要將字符串傳遞給setTimeout,並且要小心保留this的值。

var self = this; 
setDelay = setTimeout(function() { 
          $(self).addClass('hover').find('.level-2').fadeIn(200); 
         }, 500);