2012-02-10 105 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);