我尝试在 1 秒后调用 .hide()(使用 setTimeout),但它是直接执行的,为什么

I try to call .hide() after 1sec (using setTimeout), but it's executed directly, why?

本文关键字:为什么 执行 setTimeout 调用 hide 使用      更新时间:2023-09-26

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

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 milisec deplay 和 2.我该怎么做才能正常工作?

如果我得到这个工作,我想补充一点:当在 1000milise 中输入子导航时,setTimeout 会停止,这样导航就不会被隐藏。这就是我所拥有的,但我无法测试它,导致孔设置超时的事情不起作用:

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();
    });
});

匿名函数正在自行执行。

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);

复杂的方式:

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);

这是因为您执行了一个函数并将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);