setTimeout()和设置参数

Ben*_*Ben 10 jquery settimeout

我有一些看起来像这样的jQuery代码:

$('.mainNav2 > li').mouseleave(function(){
    var someNum = Math.random();
    $(this).attr('id', someNum);
    var t = setTimeout("HideMenu(someNum)", 200);
    $('li.clicked').mouseenter(function() {
        clearTimeout(t);
    });
});

function HideMenu(id) {
    $('#'+id).removeClass('clicked');
}
Run Code Online (Sandbox Code Playgroud)

它的目的是在鼠标离开时隐藏一个巨型菜单,但也考虑到意外的鼠标离开,使用300毫秒setTimeout.如果用户在300毫秒内将鼠标指针返回到li,则不会隐藏菜单,因为调用了clearTimout(t).

问题是当用户意图使用mouseout时,不会调用setTimout中的函数.根据这个页面:http://www.w3schools.com/js/js_timing.asp我的语法是正确的,但我只能从setTimeout中调用HideMenu函数,如果我这样写:

var t = setTimeout(HideMenu, 300);
Run Code Online (Sandbox Code Playgroud)

为什么它不能像写入一样工作,我可以将变量作为参数传递给函数?

Mar*_*sen 13

为了使它工作,并且不使用令人讨厌的eval版本的setTimeout更改:

var t = setTimeout("HideMenu(someNum)", 200);
Run Code Online (Sandbox Code Playgroud)

对此:

var t = setTimeout(function(s) {  
                 return function() { HideMenu(s) } }(someNum), 200);
Run Code Online (Sandbox Code Playgroud)

这样就可以将值传递给范围内someNum的变量.ssetTimeout

  • @ Nyuszika7H:尝试真正阅读我的答案,你可能会发现我建议不要这样做,而且我的解决方案不会这样做 (3认同)

Roi*_*Roi 13

虽然明确正确的答案是实现这一目标的一种方法......我不相信这是正确的.

请参阅随附的JS Fiddle:http: //jsfiddle.net/PWHw3/

我们在这里做的主要是:

setTimeout(function, timeout, param);
Run Code Online (Sandbox Code Playgroud)

例:

var test = function(a){
    var b = (a) ? a : "fail";
    alert(b);
};
setTimeout(test, 500, "works");
Run Code Online (Sandbox Code Playgroud)

这对我有用,并且无需通过两个功能.

  • 请注意,将参数传递给`setTimeout()`和`setInterval()`不是跨浏览器的解决方案(即,它在Internet Explorer中失败). (4认同)