0

1秒後にマウスアウト(.hover()の2番目の関数)するとサブナビゲーションを非表示にしようとし、そのために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

関数を実行して 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 に答える