【问题标题】:jQuery menu broken when moving between list items在列表项之间移动时 jQuery 菜单损坏
【发布时间】:2009-09-22 16:30:07
【问题描述】:

我创建了一个带有下拉菜单的自定义 jQuery 水平菜单。最初它只是在悬停在列表项上时淡入子菜单,并在移开时淡出。

但是我想创建一个效果,如果您将鼠标移出子菜单,它不会立即消失(例如,如果您超出了一个像素)。我在上一个问题中了解到 hoverIntent 插件,但是在打开同级子菜单时它会出现令人讨厌的延迟。所以我从头开始考虑自己的功能。

我的 HTML 是一个标准的嵌套列表,ul#menu > li > ul > li。我的 Javascript 如下:

var menuVisible = false;
var cancelTimeout = false;

$(document).ready(function(){
  $('ul#menu > li').hover(
    function(){
      menuMouseOver( $(this) );
    },
    function(){
      menuMouseOut( $(this) );
    }  
  );
});

function menuMouseOver( $li )
{
  // if one of the menus is down, check which one we're hovering
  if ( menuVisible ) {
    cancelTimeout = true;  
    if ( $li.find('>ul').css('display') == 'block' ) {
      // do nothing if we're hovering over current menu
    }
    else {
      // turn off all menus
      $li.parent().find('>li').each( function() {
        menuOff( $li )
      });
    }
  }

  menuOn( $li );
  menuVisible = true;
}

function menuMouseOut( $li )
{
  setTimeout( 
    function(){
      if ( !cancelTimeout ) {
        menuOff( $li );
        menuVisible = false;
      }
      cancelTimeout = false;
    },
    2000
  );

}

function menuOn( $li )
{
  $li.css('background-position', 'left bottom');
  $li.find('>ul').fadeIn('fast');
}
function menuOff( $li )
{
  $li.css('background-position', 'left top');
  $li.find('>ul').fadeOut('fast');
}

以下事情起作用:

  • 在顶级li 上移动会打开子菜单。
  • 离开子菜单会在 2 秒后将其关闭(用于测试目的;将在最终版本中减少)。
  • 离开子菜单并返回会取消超时,从而阻止菜单消失

但是,这些不起作用:

  • 当从一个顶级列表项移动到下一个时,上一个子菜单不会消失。我希望它立即淡出,没有正常的延迟。
  • 如果我在两个顶级列表项之间移动,menuVisible 被设置为false,这会搞砸系统。这是因为cancelTimeout 在您移到第一个同级时设置为 true,当您移到第二个同级时它仍然为 true。

我希望能深入了解为什么会发生这种情况,当然还有如何解决它。

【问题讨论】:

    标签: jquery menu settimeout


    【解决方案1】:

    你试过Superfish菜单jQuery插件吗?

    我在我的项目中使用过它,我认为它会为你解决这些问题。

    【讨论】:

    • @fudgey:这根本不是我想要的。当您将鼠标移开时,菜单就会消失。我已经在 5 分钟内完成了(我的意思是 jQuery 非常简单)。
    • 感谢 Daniel,Superfish 插件运行良好。我通常是具有多余功能的插件的忠实拥护者,但即使有阴影和其他无意义的废话,Superfish 也非常少。
    • @DisgruntledGoat:很酷,我很高兴能帮上忙。我注意到已经有一周没有更好的答案了。也许您可以接受这个答案来帮助那些可能正在寻找没有接受答案的问题的其他人。
    • “已于 9 月 22 日 23:50 接受” - 也许您也错过了绿色背景色?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多