求助:点击外部关闭下拉框仅在<nav>容器外生效的问题
嘿,我来帮你搞定这个导航栏的小问题~
问题原因分析
你的核心问题出在下拉框关闭的触发条件上。当前的mouseup事件逻辑是:只有当点击的目标**完全不在<nav>容器范围内(既不是<nav>本身,也不是它的任何后代元素)**时,才会执行下拉框关闭代码。
但当你点击<nav>内部的空白区域时,点击目标要么是<nav>容器本身,要么是它的子元素(但不是导航按钮),这时候!container.is(e.target) && container.has(e.target).length === 0这个判断条件不成立,自然不会触发关闭逻辑。
解决方案
我们需要调整判断逻辑:当点击的区域是<nav>内部,但不是导航按钮(.click)及其后代元素时,同样触发下拉框关闭。
修改后的完整jQuery代码如下:
$(document).ready(function() { $(".click").on("click", function(e) { var menu = $(this); toggleDropDown(menu); // 阻止事件冒泡,避免点击按钮时触发document的mouseup事件导致下拉框刚开就关 e.stopPropagation(); }); $(document).on('mouseup',function(e) { var container = $("nav"); var navButton = $(".click"); // 两种情况触发关闭: // 1. 点击nav容器外部 // 2. 点击nav内部,但不是导航按钮及其后代 if ( (!container.is(e.target) && container.has(e.target).length === 0) || (container.has(e.target).length > 0 && !navButton.is(e.target) && navButton.has(e.target).length === 0) ) { $('a.active').parent().find('.showup').stop(true, true).slideUp(500, function() { $(".main-container").removeClass("black-bg"); if ($('a.active').hasClass('active')) { $('a.active').removeClass('active'); } }); } }); }); function toggleDropDown(menu) { var isActive = $('a.active').length; $('a.active').parent().find('.showup').stop(true, true).slideUp(500, function() { $(".main-container").removeClass("black-bg"); if (menu.hasClass('active')) { menu.removeClass('active'); } else { $('a.active').removeClass('active'); menu.addClass('active'); menu.parent().find('.showup').stop(true, true).slideDown(500, function() { $(".main-container").addClass("black-bg"); }); } }); if (!isActive) { menu.addClass('active'); menu.parent().find('.showup').stop(true, true).slideDown(500, function() { $(".main-container").addClass("black-bg"); }); } }
关键修改说明
- 在导航按钮的
click事件里添加了e.stopPropagation():防止点击按钮时事件冒泡到document,导致下拉框刚打开就被关闭。 - 扩展了
mouseup事件的判断条件:新增了“点击<nav>内部但不属于导航按钮区域”的判断,这样点击nav内的空白处也会触发下拉框关闭逻辑。
内容的提问来源于stack exchange,提问作者Nesta
相关产品推荐
相关产品推荐

