【问题标题】:menu should hide when not being hovered over with timeout当没有超时悬停时,菜单应该隐藏
【发布时间】:2013-01-07 01:40:00
【问题描述】:

我想要完成的是有一个在单击“按钮”时会显示的菜单(按钮和菜单位于不同的元素中,因此鼠标最初不会悬停在菜单上)。

如果在超时期间未将鼠标悬停在菜单上,则菜单应自行隐藏(目前它会这样做,但仅在第一次单击时)。

另外,如果元素悬停在上面,我想在鼠标悬停时隐藏并清除计时器并再次单击按钮将重置超时(它可能不会重置?)。

我已经尝试了几个化身,但我尝试过的都没有表现正确,我正在寻求建议。这是我目前正在使用的:

var mytimer = window.setTimeout(function() {$('.menu-div').slideUp(function() {
        window.clearTimeout(this.mytimer);
})
}, 5000);

$().ready(function(){

    $('#menu-button').click(function () {
        $('.menu-div').slideDown();
        $(mytimer);
    });

    $('.menu-div').mouseenter(function() {
       window.clearTimeout(this.mytimer);
    });

    $('.menu-div').mouseout(function() {
        $('.menu-div').slideUp(200);
    });
});

【问题讨论】:

  • garagetimer 还用在什么地方?您的代码仅使用它来清除超时...
  • 假设您想重新激活计时器,但完全不清楚预期的行为是什么。 Garagetimer 在任何地方都没有定义为setTimout。目前myTimer 仅在页面加载时被激活。不起作用的代码永远不能很好地替代解释它应该做什么
  • 抱歉,garagetimer 不应该在里面。那是一个错字。
  • 是的,我希望计时器在单击按钮时重新激活。
  • 你使用 var mytimer 和 this.mytimer 好像它们是同一个东西。

标签: javascript jquery timeout settimeout


【解决方案1】:

我认为你想要这样的东西(只是猜测,因为你没有提供任何 HTML)

$(function(){
    var mytimer=0;  
    $('#menu-button').click(function () {
        $('.menu-div').slideDown();
        mytimer = setTimeout(function(){
            $('.menu-div').slideUp();
        }, 5000);
    });

    $('.menu-div').mouseenter(function() {
        clearTimeout(mytimer);
    });

    $('.menu-div').mouseleave(function() {
        $('.menu-div').slideUp();
    });
});

DEMO.

【讨论】:

  • 这正是我所追求的。在以前的 cmets 之后,我能够弄清楚。我的问题是,为什么将计时器设置为 0?不只是将其声明为 var mytimer;工作?还是这是个坏主意?
  • @Justin,直接声明就可以了。
猜你喜欢
  • 2021-11-26
  • 1970-01-01
  • 2014-09-05
  • 2013-04-19
  • 2021-03-20
  • 2023-03-19
  • 1970-01-01
  • 2014-09-13
  • 2012-12-13
相关资源
最近更新 更多