单击 HTML 子菜单时显示

HTML subsubmenu show when clicked

本文关键字:显示 菜单 HTML 单击      更新时间:2023-09-26

我正在尝试创建一个包含子项的菜单,如下所示:

>Menu
 >Sub-Item
  >Sub-Sub-Item
  >Sub-Sub-Item2
 >Sub-Item2

我遇到的问题是当我单击子项目时,子项目关闭(我不想要)

function menuTrigger(e){
  if(!hasClass(e,"active")){
    e.classList.add("active");
    e.height="auto";
    var child=getNextChild(e,"UL");
    child.height=0;
    child.style.display="block";
    child.height="auto";
  }
  else{
    if(hasClass(e,"active")){
      e.classList.remove("active");
      var child=getNextChild(e,"UL");
      child.height=0;
      child.style.display="none";
      child.height="0";
    }
  }
}
function hasClass(element,selector)
{
  var className=" "+selector+" ";
  return ((" "+ element.className+ " ").replace(/['n't]/g," ").indexOf(className)>1)
}
function getNextChild(element,tagName){
  for(var index=0;index<element.children.length;index++)
  {
    if(element.children[index].tagName==tagName.toUpperCase())
    {
      return element.children[index];
    }
  }
  return null;
}
body { background: #FFF;}
.wrap{width: 100%;max-width: 300px;margin:20px auto;}
.goo-collapsible{list-style: none;font-family: 'HelveticaNeue', Arial, Helvetica, sans-serif;font-size:14px}
.goo-collapsible li.header{color: #666; padding:4px 12px;border: 1px solid #bbb;}
.goo-collapsible li { border: 1px solid #bbb;border-top:0; margin: 0;background:#F0F0F0;}
.goo-collapsible li a {  text-decoration:none; color:#666;display:block; padding:8px 12px;}
.goo-collapsible li a:hover {background: #F8F8F8; text-decoration:none;}
.goo-collapsible li ul { list-style: none; background: #d3d3d3; display: none; margin:0;padding:0;}
.goo-collapsible li ul li { margin:0; border:0; border-bottom:1px solid #bbb;}
.goo-collapsible li ul li:last-child {border-bottom:0;}
.goo-collapsible li ul li a { padding: 5px 10px; display: block; padding-left: 33px;background: #d3d3d3; }
.goo-collapsible li ul li a:hover { background: #d9d9d9; }
.goo-collapsible .dropdown > a { background: url(images/arrowdown.png) no-repeat right center; }
.goo-collapsible .dropdown > a:hover { background: #F8F8F8 url(images/arrowdown.png) no-repeat right center !important; }
.goo-collapsible li ul li ul li a{ background: #f5e6ff;}
<div class="wrap"> 
  <ul class="goo-collapsible goo-coll-stacked">
    <li class='dropdown' onClick="menuTrigger(this);"><a class=''><span class='icon-table'></span> Formulaires</a>
      <ul>
        <li class='dropdown' onClick="menuTrigger(this);"><a>Sub-Menu</a>
          <ul>
            <li>
              <a href="somesite.html" target="_blank">Sub-SubMenu1</a>
            </li>
            <li>
              <a href="somesite2.html" target="_blank">Sub-SubMenu2</a>
            </li>
            <li>
              <a href="blahblah.html" target="_blank">Sub-SubMenu3</a>
            </li>
            <li>    
              <a href="blahblah2.html" target="_blank">Sub-SubMenu4</a>
            </li>
            <li>
              <a href="blahblah3.html" target="_blank">Sub-SubMenu5</a>
            </li>
          </ul>
        </li>
        <li ><a href='#'>Comments</a></li>
        <li ><a href='#'>Tags</a></li>
      </ul>
    </li>
    <li><a href='#'><span class='icon-folder-open'></span> Folder</a></li>
    <li class='dropdown' onClick="menuTrigger(this);"><a href='#'><span class='icon-user'></span> Users</a>
      <ul>
        <li ><a href='#'>Group</a></li>
        <li ><a href='#'>User</a></li>
      </ul>
    </li>
    <li><a href='#'><span class='icon-cogs'></span> Settings</a></li>                
  </ul>    
</div>

请不要使用JQuery或其他Javascript框架给我答案。当我打开菜单时(当我单击子项时它已关闭),子项是打开的,但我希望当我单击子项时,子项也保持打开状态。

我建议不要在HTML中内联事件处理程序。 而是通过 javascript 附加事件侦听器。 然后,完成此操作后,利用传递给 menuTrigger 函数的事件对象来确定事件的目标是否是子菜单。 如果是子菜单,并且事件正在为父菜单触发,则只需在menuTrigger方法的顶部执行return。 显然,使用的语法取决于您想要的跨浏览器程度。 event.target是通用的,但addEventListener()仅是IE 9+。 由于这个限制,我也选择使用querySelectorAll(),它同样是IE 9+

var dropdowns = document.querySelectorAll('.goo-collapsible .dropdown');
for(var i = 0, len = dropdowns.length; i < len; i++) {
  dropdowns[i].addEventListener('click', menuTrigger);
}
function menuTrigger(e){
  var el = this;
  if(e.target.parentNode !== el) {
    return;
  }
  if(!hasClass(el,"active")){
    el.classList.add("active");
    el.height="auto";
    var child=getNextChild(el,"UL");
    child.height=0;
    child.style.display="block";
    child.height="auto";
  }
  else{
    if(hasClass(el,"active")){
      el.classList.remove("active");
      var child=getNextChild(el,"UL");
      child.height=0;
      child.style.display="none";
      child.height="0";
    }
  }
}
function hasClass(element,selector)
{
  var className=" "+selector+" ";
  return ((" "+ element.className+ " ").replace(/['n't]/g," ").indexOf(className)>1)
}
function getNextChild(element,tagName){
  for(var index=0;index<element.children.length;index++)
  {
    if(element.children[index].tagName==tagName.toUpperCase())
    {
      return element.children[index];
    }
  }
  return null;
}
body { background: #FFF;}
.wrap{width: 100%;max-width: 300px;margin:20px auto;}
.goo-collapsible{list-style: none;font-family: 'HelveticaNeue', Arial, Helvetica, sans-serif;font-size:14px}
.goo-collapsible li.header{color: #666; padding:4px 12px;border: 1px solid #bbb;}
.goo-collapsible li { border: 1px solid #bbb;border-top:0; margin: 0;background:#F0F0F0;}
.goo-collapsible li a {  text-decoration:none; color:#666;display:block; padding:8px 12px;}
.goo-collapsible li a:hover {background: #F8F8F8; text-decoration:none;}
.goo-collapsible li ul { list-style: none; background: #d3d3d3; display: none; margin:0;padding:0;}
.goo-collapsible li ul li { margin:0; border:0; border-bottom:1px solid #bbb;}
.goo-collapsible li ul li:last-child {border-bottom:0;}
.goo-collapsible li ul li a { padding: 5px 10px; display: block; padding-left: 33px;background: #d3d3d3; }
.goo-collapsible li ul li a:hover { background: #d9d9d9; }
.goo-collapsible .dropdown > a { background: url(images/arrowdown.png) no-repeat right center; }
.goo-collapsible .dropdown > a:hover { background: #F8F8F8 url(images/arrowdown.png) no-repeat right center !important; }
.goo-collapsible li ul li ul li a{ background: #f5e6ff;}
<div class="wrap"> 
  <ul class="goo-collapsible goo-coll-stacked">
    <li class='dropdown'><a class=''><span class='icon-table'></span> Formulaires</a>
      <ul>
        <li class='dropdown'><a>Sub-Menu</a>
          <ul>
            <li>
              <a href="somesite.html" target="_blank">Sub-SubMenu1</a>
            </li>
            <li>
              <a href="somesite2.html" target="_blank">Sub-SubMenu2</a>
            </li>
            <li>
              <a href="blahblah.html" target="_blank">Sub-SubMenu3</a>
            </li>
            <li>    
              <a href="blahblah2.html" target="_blank">Sub-SubMenu4</a>
            </li>
            <li>
              <a href="blahblah3.html" target="_blank">Sub-SubMenu5</a>
            </li>
          </ul>
        </li>
        <li ><a href='#'>Comments</a></li>
        <li ><a href='#'>Tags</a></li>
      </ul>
    </li>
    <li><a href='#'><span class='icon-folder-open'></span> Folder</a></li>
    <li class='dropdown'><a href='#'><span class='icon-user'></span> Users</a>
      <ul>
        <li ><a href='#'>Group</a></li>
        <li ><a href='#'>User</a></li>
      </ul>
    </li>
    <li><a href='#'><span class='icon-cogs'></span> Settings</a></li>                
  </ul>    
</div>

编辑

或者完全显而易见的答案。 我不敢相信我没有早点看到这一点。 只需使用event.stopPropagation

var dropdowns = document.querySelectorAll('.goo-collapsible .dropdown');
for(var i = 0, len = dropdowns.length; i < len; i++) {
  dropdowns[i].addEventListener('click', menuTrigger);
}
function menuTrigger(e){
  var el = this;
  
  e.stopPropagation();
  if(!hasClass(el,"active")){
    el.classList.add("active");
    el.height="auto";
    var child=getNextChild(el,"UL");
    child.height=0;
    child.style.display="block";
    child.height="auto";
  }
  else{
    if(hasClass(el,"active")){
      el.classList.remove("active");
      var child=getNextChild(el,"UL");
      child.height=0;
      child.style.display="none";
      child.height="0";
    }
  }
}
function hasClass(element,selector)
{
  var className=" "+selector+" ";
  return ((" "+ element.className+ " ").replace(/['n't]/g," ").indexOf(className)>1)
}
function getNextChild(element,tagName){
  for(var index=0;index<element.children.length;index++)
  {
    if(element.children[index].tagName==tagName.toUpperCase())
    {
      return element.children[index];
    }
  }
  return null;
}
body { background: #FFF;}
.wrap{width: 100%;max-width: 300px;margin:20px auto;}
.goo-collapsible{list-style: none;font-family: 'HelveticaNeue', Arial, Helvetica, sans-serif;font-size:14px}
.goo-collapsible li.header{color: #666; padding:4px 12px;border: 1px solid #bbb;}
.goo-collapsible li { border: 1px solid #bbb;border-top:0; margin: 0;background:#F0F0F0;}
.goo-collapsible li a {  text-decoration:none; color:#666;display:block; padding:8px 12px;}
.goo-collapsible li a:hover {background: #F8F8F8; text-decoration:none;}
.goo-collapsible li ul { list-style: none; background: #d3d3d3; display: none; margin:0;padding:0;}
.goo-collapsible li ul li { margin:0; border:0; border-bottom:1px solid #bbb;}
.goo-collapsible li ul li:last-child {border-bottom:0;}
.goo-collapsible li ul li a { padding: 5px 10px; display: block; padding-left: 33px;background: #d3d3d3; }
.goo-collapsible li ul li a:hover { background: #d9d9d9; }
.goo-collapsible .dropdown > a { background: url(images/arrowdown.png) no-repeat right center; }
.goo-collapsible .dropdown > a:hover { background: #F8F8F8 url(images/arrowdown.png) no-repeat right center !important; }
.goo-collapsible li ul li ul li a{ background: #f5e6ff;}
<div class="wrap"> 
  <ul class="goo-collapsible goo-coll-stacked">
    <li class='dropdown'><a class=''><span class='icon-table'></span> Formulaires</a>
      <ul>
        <li class='dropdown'><a>Sub-Menu</a>
          <ul>
            <li>
              <a href="somesite.html" target="_blank">Sub-SubMenu1</a>
            </li>
            <li>
              <a href="somesite2.html" target="_blank">Sub-SubMenu2</a>
            </li>
            <li>
              <a href="blahblah.html" target="_blank">Sub-SubMenu3</a>
            </li>
            <li>    
              <a href="blahblah2.html" target="_blank">Sub-SubMenu4</a>
            </li>
            <li>
              <a href="blahblah3.html" target="_blank">Sub-SubMenu5</a>
            </li>
          </ul>
        </li>
        <li ><a href='#'>Comments</a></li>
        <li ><a href='#'>Tags</a></li>
      </ul>
    </li>
    <li><a href='#'><span class='icon-folder-open'></span> Folder</a></li>
    <li class='dropdown'><a href='#'><span class='icon-user'></span> Users</a>
      <ul>
        <li ><a href='#'>Group</a></li>
        <li ><a href='#'>User</a></li>
      </ul>
    </li>
    <li><a href='#'><span class='icon-cogs'></span> Settings</a></li>                
  </ul>    
</div>