javascript - Mouseup 事件与可见性切换冲突

标签 javascript jquery events

我创建了一个函数,可以根据菜单的可见性来切换菜单。我还为文档分配了一个 mouseup 事件,如果用户单击菜单之外的任何位置,菜单就会关闭。问题是当为 document 添加 mouseup 事件监听器时,切换不再起作用。可见性测试:$menu.is(":visible"); 返回 false,尽管菜单清晰可见。这是怎么回事?

$(function() {
  var $toggleMenu = $(".toggle-menu"),
      $menu = $(".menu");
    
  $toggleMenu.on("click", function(e) {
    e.preventDefault();
		
    toggleUserMenu();
  });
  
  $(document).on("mouseup", function (e) {
      
    if (!$menu.is(e.target) && $menu.has(e.target).length === 0) {
      $menu.hide();
    }
  });

  function toggleUserMenu() {
    var menuIsVisible = $menu.is(":visible");

    if (menuIsVisible) {
	  $menu.hide();
	} else {
      $menu.show();
	}
  }
});
.toggle-menu {
  color: #444;
  display: inline-block;
  margin-bottom: 15px;
  text-decoration: none;
}

.menu {
  border: 1px solid black;
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<a href="" class="toggle-menu">Toggle Menu</a>

<div class="menu">
  <a href="#" class="menu-item">Menu Item 1</a>
  <a href="#" class="menu-item">Menu Item 2</a>
  <a href="#" class="menu-item">Menu Item 3</a>
</div>

最佳答案

一种解决方案是防止冲突区域中的mouseup冒泡。

$(function() {
  var $toggleMenu = $(".toggle-menu"),
      $menu = $(".menu");

  $toggleMenu.on("click", function(e) {
    e.preventDefault();

    toggleUserMenu();
  });

  $toggleMenu.on("mouseup", function(e) {
    e.preventDefault();
    e.stopPropagation();
  });

  $(document).on("mouseup", function (e) {

    if (!$menu.is(e.target) && $menu.has(e.target).length === 0) {
      $menu.hide();
    }
  });

  function toggleUserMenu() {
    var menuIsVisible = $menu.is(":visible");
console.log(menuIsVisible);
    if (menuIsVisible) {
      $menu.hide();
    } else {
      $menu.show();
    }
  }
});
<小时/>
  $toggleMenu.on("mouseup", function(e) {
    e.preventDefault();
    e.stopPropagation();
  });

这将捕获与切换按钮上的单击一起触发的mouseup,并阻止其冒泡到documentpreventDefault() 在这里没有任何特定目的,它随我复制的您的代码一起提供:)

这是一个fiddle

关于javascript - Mouseup 事件与可见性切换冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33086790/

相关文章:

javascript - 禁用对象的事件监听

javascript - Javascript 是否按顺序运行代码行?并完成处理然后继续?

javascript - 如何将字符串转换为对象的属性,它也是一个对象

javascript - 选择单选按钮时显示文本框

jquery - jQplot 条形颜色错误与负值

c# - 在 Visual Studio 中自动创建处理程序签名

javascript - 如何将 Node.js 变量放入我的 &lt;script&gt;&lt;/script&gt; 中?

javascript - 以编程方式更改为对象中的另一个键

javascript - 使用 JavaScript 只允许 HTML 输入中的特定字符

javascript循环添加点击事件到按钮