javascript - 如何仅在单击父级时发生事件,但在子级时不发生事件(向下两级)

标签 javascript jquery events menu

我正在做一个侧面菜单,当单击父 li 元素时,它会隐藏和显示子菜单,我快完成了。问题是,如果单击 li 子项(向下两级),它也会隐藏子菜单。

父级应该是唯一能够触发该事件的人。

这里有 Html、CSS 和 JavaScript (jQuery) 的简化版本:

$( document ).ready( function () {
  $( "li.has-submenu" ).on( 'click', function (e) {
    if( $("#submenu").hasClass( "hides" ) ){
      $("#submenu").slideDown().toggleClass( "hides" );
    } else {
      $("#submenu").slideUp().toggleClass( "hides" );
    }
  });
});
.hide {
  display: none;
}

#submenu {
  margin-left: 15px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="nav">
    <li class="has-submenu">
      <a href="#">Overview </a>
      <ul id="submenu" class="nav hide">
        <li class="active">
          <a href="#">Overview </a>
        </li>
        <li>
          <a href="#">Account Settings </a>
        </li>
        <li>
          <a href="#">Tasks </a>
        </li>
        <li>
          <a href="#">
            Help </a>
        </li>
      </ul>
    </li>
    <li>
      <a href="#">Account Settings </a>
    </li>
    <li>
      <a href="#">Tasks </a>
    </li>
    <li>
      <a href="#">Help </a>
    </li>
  </ul>

您知道如何解决此问题吗?

最佳答案

尝试对您不希望触发父级的元素使用 .stopPropagation() 函数:

$( document ).ready( function () {
  $( "li.has-submenu" ).on( 'click', function (e) {
    if( $("#submenu").hasClass( "hides" ) ){
      $("#submenu").slideDown().toggleClass( "hides" );
    } else {
      $("#submenu").slideUp().toggleClass( "hides" );
    }
  });
  
  $( "li.has-submenu li" ).click(function(e) {
        e.stopPropagation();
   });
});
.hide {
  display: none;
}

#submenu {
  margin-left: 15px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul class="nav">
    <li class="has-submenu">
      <a href="#">Overview </a>
      <ul id="submenu" class="nav hide">
        <li class="active">
          <a href="#">Overview </a>
        </li>
        <li>
          <a href="#">Account Settings </a>
        </li>
        <li>
          <a href="#">Tasks </a>
        </li>
        <li>
          <a href="#">
            Help </a>
        </li>
      </ul>
    </li>
    <li>
      <a href="#">Account Settings </a>
    </li>
    <li>
      <a href="#">Tasks </a>
    </li>
    <li>
      <a href="#">Help </a>
    </li>
  </ul>

关于javascript - 如何仅在单击父级时发生事件,但在子级时不发生事件(向下两级),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44393015/

相关文章:

javascript - 如何获取office.js中的所有名称(而不是值)?

javascript - 如何打破 async.js 每个循环?

javascript - 使用复选框将 JSON 结果解析为对象

javascript - 用于聊天室的 AJAX、jQuery、javascript

iphone - 底层 View 如何知道其矩形是否被触摸,无论是直接还是间接?

javascript - 如何让 javascript 代码*按顺序*执行

javascript - dcjs 序数条形图上的 y 轴?

javascript - 更改整个 html 文档的 FontSize 的简单方法

javascript - 在没有事件的情况下从 HTML 执行 javascript 函数

java - 当 JFrame 移动到桌面前面时会触发什么 Swing 事件