0

我尝试在 1 秒后鼠标移出(.hover() 中的第二个函数)时隐藏子导航,为此我使用 setTimeout。我需要 setTimeout 的内部函数中的 this 变量,所以我这样尝试:

jQuery(".topnav > ul > li").hover(function() {
        jQuery("ul.topnavsub").hide();
        jQuery(this).find("ul.topnavsub").show();
    }, function() {
        var t = setTimeout((function(that){jQuery(that).find("ul.topnavsub").hide(); console.log(that);})(this), 1000);
    });

这有效,但没有延迟。1. 为什么没有 1000 毫秒延迟和 2. 我必须如何才能正常工作?

如果我得到这个工作,我想补充一点:在 1000 毫秒内输入子导航时,setTimeout 停止,因此导航不会被隐藏。这就是我所拥有的,但我无法测试它导致孔 setTimeout-thing 不起作用:

jQuery(".topnav > nav > ul > li").hover(function() {
    jQuery("ul.topnavsub").off();
    jQuery("ul.topnavsub").hide();
    jQuery(this).find("ul.topnavsub").show();
}, function() {
    var t = setTimeout((function(that){jQuery(that).find("ul.topnavsub").hide(); console.log(that);})(this), 1000);
    jQuery(this).find("ul.topnavsub").on("mouseenter", function() {
        clearTimeout(t);
        jQuery(this).off();
    });
});
4

3 回答 3

0

复杂的方式:

var t = setTimeout((function(that){ return function(){
    jQuery(that).find("ul.topnavsub").hide();
    console.log(that);
  }
})(this), 1000);

不太酷但仍然有效(并且可能更易读)的方式:

var that = this;
var t = setTimeout(function(){ 
    jQuery(that).find("ul.topnavsub").hide();
    console.log(that);
}, 1000);
于 2013-10-17T09:28:02.683 回答
0

匿名函数正在自我执行。

var t = setTimeout((function(that){
        jQuery(that).find("ul.topnavsub").hide(); 
        console.log(that);
    })(this),  //(this) is self executing
    1000);
});

选择:

var that = this;
var t = setTimeout(function(){
        jQuery(that).find("ul.topnavsub").hide(); 
        console.log(that);
    },1000);
于 2013-10-17T09:29:34.193 回答
0

这是因为您执行了一个函数并将 undefined 传递给 setTimeout

var t = setTimeout((function(that){
   jQuery(that).find("ul.topnavsub").hide();
   console.log(that);
})(this), 1000);

只需(this)从函数末尾删除

var self = this;
var t = setTimeout(function(){
   jQuery(self).find("ul.topnavsub").hide();
   console.log(self);
}, 1000);
于 2013-10-17T09:30:34.957 回答