我上周刚开始使用jQuery编写代码,需要一些帮助来确定如何使菜单正常工作。我有3个标签,每个标签都有自己的菜单。显示页面时,会自动显示菜单和子菜单。一旦显示,用户可以将鼠标悬停在选项卡上以查看其他子菜单,当它们停止悬停时,将显示原始子菜单。
我的问题是,虽然我可以向他们展示其他标签的子菜单,但是我无法打开子菜单以供用户点击子菜单项。其他教程展示了如何仅在子菜单嵌套在父元素中时才这样做,但我的菜单结构代码没有嵌套子菜单(这是我加入项目时代码的方式)。如果用户在相应的选项卡上悬停,我是否可以通过某种方式保持子菜单打开?
这是我的菜单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();
});
答案 0 :(得分: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();
});
希望这对你有所帮助。我自己解决了这个问题,所以没有时间去研究它,我确信有更好更漂亮的方法来做到这一点。
答案 1 :(得分:2)
我有类似的情况,不幸的是我无法重新格式化我的整个菜单以适应'正确'的父/子结构。
如果您只是在选择器中调用子菜单,它将在悬停状态期间保持“打开”状态。
示例 -
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();
});
});