You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery Bootstrap多级下拉菜单鼠标悬停交互异常问题求助

多级下拉菜单悬停冲突问题解决

问题描述

页面加载时所有.test链接的下拉菜单默认收起,悬停第一个.test元素时下拉展开/收起功能正常,但切换到第二个.test元素悬停时,之前展开的下拉菜单不会自动关闭,必须再次悬停该元素才能收起。

原代码

JavaScript

$(document).ready(function(){
  $('.dropdown-submenu a.test').on("mouseover", function(e){
    $(this).next('ul').toggle();
    e.stopPropagation();
    e.preventDefault();
  });
});

CSS

.dropdown-submenu {
  position: relative;
}

.dropdown-submenu .dropdown-menu {
  top: 0;
  left: 100%;
  margin-top: -1px;
}

HTML

<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
   
<div class="container">
  <h2>Multi-Level Dropdowns</h2>                                      
  <div class="dropdown">
    <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown">Tutorials
    <span class="caret"></span></button>
    <ul class="dropdown-menu">
      <li class="dropdown-submenu">
        <a class="test" tabindex="-1" href="#">HTML<span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li><a tabindex="-1" href="#">1st HTML</a></li>
          <li><a tabindex="-1" href="#">2nd HTML</a></li>
        </ul></li>
      <li class="dropdown-submenu">
        <a class="test" tabindex="-1" href="#">CSS<span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li><a tabindex="-1" href="#">1st CSS</a></li>
          <li><a tabindex="-1" href="#">2nd CSS</a></li>
        </ul></li>
      <li class="dropdown-submenu">
        <a class="test" tabindex="-1" href="#">New dropdown <span class="caret"></span></a>
        <ul class="dropdown-menu">
          <li><a tabindex="-1" href="#">2nd level dropdown</a></li>
          <li><a tabindex="-1" href="#">2nd level dropdown</a></li>
        </ul></li>
    </ul>
  </div>
</div>
</body>

解决方案

方案1:修改toggle逻辑,先关闭其他菜单

修改JavaScript代码,在触发当前元素悬停时,先关闭所有其他已展开的下拉菜单,再切换当前菜单的显示状态:

$(document).ready(function(){
  $('.dropdown-submenu a.test').on("mouseover", function(e){
    // 关闭所有非当前元素的下拉子菜单
    $('.dropdown-submenu a.test').not(this).next('ul').hide();
    // 切换当前下拉菜单的显示状态
    $(this).next('ul').toggle();
    e.stopPropagation();
    e.preventDefault();
  });
});

方案2:改用mouseenter/mouseleave事件,优化交互体验

如果希望鼠标离开元素时自动收起菜单,改用mouseenter和mouseleave事件,逻辑更清晰:

$(document).ready(function(){
  $('.dropdown-submenu a.test').on("mouseenter", function(e){
    // 关闭所有其他下拉子菜单
    $('.dropdown-submenu a.test').not(this).next('ul').hide();
    // 展开当前下拉菜单
    $(this).next('ul').show();
    e.stopPropagation();
    e.preventDefault();
  }).on("mouseleave", function(){
    // 鼠标离开时关闭当前下拉菜单
    $(this).next('ul').hide();
  });
});

原理说明

原代码仅对当前元素的下拉菜单执行toggle操作,未处理其他已展开的菜单,导致多个菜单同时显示。添加关闭其他菜单的逻辑后,确保同一时间只有一个下拉菜单处于展开状态,解决切换时的冲突问题。

内容的提问来源于stack exchange,提问作者Shane S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 17:53:26