代码之家  ›  专栏  ›  技术社区  ›  b. e. hollenbeck

如何向jquery fadeout添加延迟?

  •  0
  • b. e. hollenbeck  · 技术社区  · 15 年前

    我正在为一个站点设计一个导航栏,我正试图搞清楚如何让子菜单显示在每个选项卡上,以便在光标离开选项卡后保持可见。因为光标离开后它会立即消失,所以我无法在子菜单上设置函数。所以我要做的是将setTimeout()引入jQuery中的.hover的外侧,但没有成功。代码如下:

    $('.hovernav').hover(
            function () {
                $(this).css('background-image', $(this).css('background-image').replace("_o.", "_i."));
                tabShowSubnav($(this).attr('id'));
            }, 
            function () {
                $(this).css('background-image', $(this).css('background-image').replace("_i.", "_o."));
                setTimeout('tabHideSubnav($(this).attr("id"))','2000');
            });
    

    这个设置缺少什么?

    3 回复  |  直到 15 年前
        1
  •  1
  •   bobince    15 年前
    function () {
        ....
        setTimeout('tabHideSubnav($(this).attr("id"))','2000');
    }
    

    _ window 不是当前的hovernav实例。

    最好不要使用带有setTimeout的字符串;而是使用函数。然后您可以访问封闭范围中的变量,您可以使用这些变量来记住 this 传递给外部函数的值。

    function() {
        ...
        var thisid= this.id;
        setTimeout(function() {
            tabHideSubnav(thisid);
        }, 2000);
    }
    

    (另一个好处是,这样可以防止javascript每次都从字符串中重新编译函数。将代码放入字符串几乎总是假的。)

    注意,如果鼠标返回悬停导航,您可能需要更多的逻辑来取消隐藏子导航。否则,当鼠标离开时,菜单栏会一直关闭,而不是一个烦人的菜单栏,如果两秒钟前鼠标离开,那么即使在鼠标悬停的时候,菜单栏也会一直关闭。

        2
  •  0
  •   Rich    15 年前

    这里只是猜测一下,但是当函数被调用时,“this”可能超出了范围。

        3
  •  0
  •   Omar    15 年前

    你试过让它在鼠标悬停时显示(),然后在鼠标悬停时淡出(“慢”)吗?

    http://docs.jquery.com/Effects/fadeOut

    或者,你也可以。动画(不透明度:0,3000)或者W/E数量对你有用。

    再编辑一次:

    您可以有.animate(不透明度:1,3000),它只会将已经可见的元素延迟3秒。

    取自: http://www.learningjquery.com/2007/01/effect-delay-trick

    下面是一个简单的片段:

    JQuery

        $(function(){
            $("#HeaderMenu").mouseover(function(){           
                $("#SubMenu").show();
             });
            $("#HeaderMenu").mouseout(function(){
                    $("#SubMenu").animate({opacity: 1}, 3000, function(){$(this).hide()});
        });