点击后jquery删除悬停?

Posted

技术标签:

【中文标题】点击后jquery删除悬停?【英文标题】:jquery remove hover after click? 【发布时间】:2022-01-07 00:56:40 【问题描述】:

我有一个下拉菜单。 当鼠标悬停在父菜单上时,子链接出现在下方。在鼠标移出菜单元素之前,子链接将一直存在。悬停被移除,子链接消失。

我试过了

$(":hover").blur();

但这不起作用。

我猜这是因为该项目没有应用焦点。只是:悬停。 有没有办法从 jquery 中删除 :hover?

谢谢

编辑以包含 html/css

<div class="menu-item">
  <button class="dropdown">Dropdown</button>
  <div class="dropdown-menu">
    <a href="#">Anchor 1</a>
    <a href="#">Anchor 2</a>
  </div>
</div>

和 CSS

.dropdown 
  background-color: #04AA6D;
  color: white;
  font-size: 16px;


.menu-item 
  position: relative;
  display: inline-block;


.dropdown-menu 
  display: none;
  position: absolute;
  z-index: 1;


.dropdown-menu a 
  color: black;
  display: block;


.menu-item:hover .dropdown-menu 
  display: block;

这是菜单示例。我的实际菜单要大得多。 当访问者将鼠标悬停在下拉菜单上时显示。 当他们仍然点击菜单时,我试图关闭菜单。好像悬停已被移除。

我试过蓝色,鼠标移出。

点击后菜单仍然显示,只有在用户滚动出菜单后才会关闭,因为菜单太大了,这并不总是可能的。

谢谢

【问题讨论】:

这感觉像是一个 XY 问题,真正的问题是点击后隐藏菜单吗?如果您包含菜单结构的最小复制示例,可能会更清楚。 如果是悬停问题,您可以使用 css 来解决。我会跟着星展银行说给代码。 你能做个小提琴吗? @NitinS jsfiddle.net/k0fd5amw/1,在这里 【参考方案1】:

您可以使用 jQuery mouseentermouseleave 事件来实现这一点, 在代码 sn-p 下面运行或检查更新的小提琴here

$(document).ready(function () 
  $('.menu-item a').click(function (e) 
    $(this).parents(".dropdown-menu").hide();
    console.log("clicked");
  );
  
  $(".menu-item").on(
    mouseenter: function () 
        $(this).find(".dropdown-menu").show();
    ,
    mouseleave: function () 
        $(this).find(".dropdown-menu").hide();
    
);
);
.dropdown 
  background-color: #04AA6D;
  color: white;
  font-size: 16px;


.menu-item 
  position: relative;
  display: inline-block;


.dropdown-menu 
  display: none;
  position: absolute;
  z-index: 1;


.dropdown-menu a 
  color: black;
  display: block;


.menu-item:hover .dropdown-menu 
  display: block;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="menu-item">
  <button class="dropdown">Dropdown</button>
  <div class="dropdown-menu">
    <a href="javascript:void(0)">Anchor 1</a>
    <a href="javascript:void(0)">Anchor 2</a>
  </div>
</div>

【讨论】:

【参考方案2】:

您可以添加样式为 display:none 的类(不要使用 .hide()),然后使用 setTimeout 删除该类。

setTimeout 让 DOM 有时间将 display:none 应用于菜单,从而移除悬停,因此当类被移除时,它不会再次显示,因为父级不再有 :hover

$(".menu-item .dropdown-menu").addClass("hidden");
setTimeout(() => $(".hidden").removeClass("hidden"), 1);

$("a").click(function() 
  $(".menu-item .dropdown-menu").addClass("hidden");
  setTimeout(() => $(".hidden").removeClass("hidden"), 1);
  // return false for demo as href="#" don't want to reload the page
  return false;
);
.dropdown 
  background-color: #04AA6D;
  color: white;
  font-size: 16px;


.menu-item 
  position: relative;
  display: inline-block;


.dropdown-menu 
  display: none;
  position: absolute;
  z-index: 1;


.dropdown-menu a 
  color: black;
  display: block;


.menu-item:hover .dropdown-menu 
  display: block;

.menu-item:hover .dropdown-menu.hidden 
  display: none;


/* show when the menu has :hover applied */
.menu-item:hover  border:1px solid yellow; 
.menu-item  border:1px solid red; 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="menu-item">
  <button class="dropdown">Dropdown</button>
  <div class="dropdown-menu">
    <a href="#">Anchor 1</a>
    <a href="#">Anchor 2</a>
  </div>
</div>

同样可以使用requestAnimationFrame 而不是setTimeout

requestAnimationFrame(() => $(".hidden").removeClass("hidden"));

这有点meh,但可能会让你继续前进,直到出现更好的答案。 更新fiddle。

【讨论】:

以上是关于点击后jquery删除悬停?的主要内容,如果未能解决你的问题,请参考以下文章

在鼠标悬停时更改背景颜色并在鼠标悬停后将其删除

Jquery:在div的悬停时附加一个类并在不悬停时删除

删除单击的悬停事件,然后再次绑定

Jquery删除悬停类

Jquery如果悬停元素添加一个按钮如果不删除按钮

在jQuery中,在鼠标悬停时添加类并在鼠标悬停时将其删除的最佳方法是啥?