2014-09-26 135 views
0

我不知道为什么我的代码不工作。请帮忙!为什么setTimeout不工作在我的代码?我需要可行的代码)

$('nav').mouseout(setTimeout(function() { 
    $(this).removeClass('subm') 
}, 1000)); 

没有setTimeout是正常工作。

+2

您正在调用setTimeout,而不是将它传递给mouseout。 – slebetman 2014-09-26 23:26:50

+3

想想'mouesout'预期的值和'setTimeout'返回的值。也想想这个回调里面会有什么'this'。 – 2014-09-26 23:27:49

回答

2

setTimeout(...)正在被立即调用。它返回新挂起超时的ID号。超时只能在这里注册并调用一次。你的代码的执行正在发生的事情是这样的:

setTimeout(function() { 
    $(this).removeClass('subm') 
}, 1000); 
// = 2 

$('nav').mouseout(2); 

你需要传递.mouseout()调用setTimeout的每个时间的函数。您还需要修复this引用,它在setTimeout回调中不同。在大多数其他语言

$('nav').mouseout(function() { 
    var self = this; 
    setTimeout(function() { 
    $(self).removeClass('subm') 
    }, 1000); 
}); 
2

在javascript中一样,当你做到这一点:这应该可以解决这两个问题

variable = some_function(); 

你一个函数的返回值传递给一个变量。同样,当你这样做:

a_function(another_function()); 

你传递另一个函数的返回值作为参数的函数。

这在JavaScript,C,PHP,Ruby甚至Fortran中都是一样的。

所以,当你这样做:

$('nav').mouseout(setTimeout(..)); 

要传递的setTimeout返回值作为参数传递给mouseout。并且setTimeout返回一个可用于clearTimeout的数字。所以你基本上是这样做的:

$('nav').mouseout(a_number); 

你想要什么,而不是被传递函数:

$('nav').mouseout(function(){setTimeout(..)}); 

或者,如果你发现很难读,然后做到这一点:

function handleMouseOut() { 
    setTimeout(...); 
} 
$('nav').mouseout(handleMouseOut); // note we're passing a function here 
            // not calling it 
相关问题