如何在jQuery hover菜单中保持子菜单打开?

4
我上周刚开始学习jQuery编程,需要一些帮助来解决如何使菜单正常工作的问题。我有三个选项卡,每个选项卡都有自己的菜单。当页面被显示时,菜单和子菜单会自动显示。一旦它被显示,用户可以悬停在选项卡上查看其他子菜单,并在停止悬停时显示最初的子菜单。
我的问题是,尽管我可以显示其他选项卡的子菜单,但我无法让子菜单保持打开状态,以便用户可以单击子菜单项。其他教程只展示了如何在子菜单嵌套在父元素中时实现此功能,但我的菜单结构代码没有嵌套子菜单(这是我加入项目时的代码)。是否有一种方法,如果用户悬停在相应的选项卡上,可以保持子菜单打开状态?
这是我的菜单HTML:
    <div id="navigation">
        <div id="main-nav">
            <div id="kids"><a href="../images/nav1.png"></a></div>
            <div id="community"><a href="../images/nav2.png"></a></div>
            <div id="about"><a href="../images/nav3.png"></a></div>
        </div>
    </div>

    <div id="sub-nav"> 
        <ul class="menu-1 requiresJS">
            <li><a href="#">Item1</a></li>
            <li><a href="#">Item2</a></li>
            <li><a href="#">Item3</a></li>
            <li><a href="#">Item4</a></li>
            <li><a href="#">Item5</a></li>
            <li><a href="#">Item6</a></li>
        </ul>
        <ul class="menu-2 requiresJS">
            <li><a href="#">Item1</a></li>
            <li><a href="#">Item2</a></li>
            <li><a href="#">Item3</a></li>
            <li><a href="#">Item4</a></li>
            <li><a href="#">Item5</a></li>
            <li><a href="#">Item6</a></li>
        </ul>
        <ul class="menu-3 requiresJS">
            <li><a href="#">Item1</a></li>
            <li><a href="#">Item2</a></li>
            <li><a href="#">Item3</a></li>
            <li><a href="#">Item4</a></li>
            <li><a href="#">Item5</a></li>
            <li><a href="#">Item6</a></li>
        </ul>

这是我目前的jQuery代码:

// For JS users, display sub menus by default
$(".requiresJS").css("display","block");

var startMenu

//hide all sub menus
$("#sub-nav ul").hide();

// check URL for about, community or kids and set startMenu with correct term
if(window.location.href.indexOf("about") != -1){startMenu = "about"}
else if(window.location.href.indexOf("community") != -1){startMenu = "community"}
else{startMenu = "kids"}

// highlight correct category tab
$("div#main-nav #" + startMenu).addClass("selected");

// show correct starting menu
$("#sub-nav ul.menu-" + startMenu).show('slide', {direction: 'right'}, 600).effect("bounce", { times:1,direction:"right",distance:13 }, 300);

// show correct menu on mouseover of div
$("div#main-nav div").mouseover(function() {

    $("#sub-nav ul").stop(true, true)
    $("#sub-nav ul").hide();

    var currentId = $(this).attr('id');

    $("#sub-nav ul.menu-" + currentId).show();      
});

$("div#main-nav div").mouseover(function() {
        $("#sub-nav ul").stop(true, true)
        $("#sub-nav ul").hide();
        var currentId = $(this).attr('id');
        $("#sub-nav ul.menu-" + currentId).show();      
});
2个回答

6

我曾经遇到过类似的情况,并通过将mouseover事件拆分为单独的mouseenter和mouseleave事件来解决。以下是伪代码/大纲,但对于你的情况,请尝试以下操作:

$("div#main-nav div").mouseenter(function() {
   // Check if sub menu is open, return if it is allready open
   // (I add a 'menu_open' class to sub menu when it is opened)

   // Code to hide open submenues
   // Code to open selected submenu      
});

然后使用mouseleave和其事件的toElement属性来检查鼠标指针去了哪里,如果它去到了一个子菜单,那么什么也不做,如果没有,则关闭所有子菜单。请注意,您还需要在子菜单上挂钩mouseleave事件。大致如下:

$("#main-nav div").mouseleave(function (event) {
   var toElem = $(event.toElement);
   if (toElem.closest("div.sub-nav").id=="subnav") return; // Prob nicer way to do this...point is to check if mouse enters a submenu, and if so stay open.
   // Close all open submenues, e.g. 
   $("#sub-nav ul").hide();
 });

 $("#subnav ul").mouseleave(function (event) {
    var toElem = $(event.toElement);
    if (toElem.closest("div.sub-nav").id=="subnav") return; // Check if entering submenu
    if (toElem.closest("div#main-nav")) return; // Check if entering main menu
    // Close all open submenues, e.g.
    $("#sub-nav ul").hide();
 });

希望这对你有所帮助。我刚刚自己解决了这个问题,所以还没有时间把它完善,我相信有更好、更漂亮的方法来解决这个问题。

有趣!我得试试这个。最终我重新格式化了整个菜单,并像教程中所说的那样嵌套了一切。它能用,但知道另一种方法也是好的。谢谢! - alipica

4

我曾经遇到类似的情况,但不幸的是我不能重新格式化整个菜单以适应“正确”的父/子结构。

如果你在选择器中简单地调用子菜单,它将在悬停状态下保持“打开”状态。

http://jsfiddle.net/K5P9Z/

示例 -

jQuery(document).ready(function($) {

$('#kids, .menu-1').hover(function() {
    $('.menu-1').show();
}, function() {
    $('.menu-1').hide();
});
 $('#community, .menu-2').hover(function() {
    $('.menu-2').show();
}, function() {
    $('.menu-2').hide();
});
 $('#about, .menu-3').hover(function() {
    $('.menu-3').show();
}, function() {
    $('.menu-3').hide();
});

});​

这是一个隐藏的宝藏答案! - TheBlackBenzKid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接