当单击子菜单父箭头元素时,我正在try 关闭所有子菜单子菜单,并将箭头旋转回来.我写的声明不起作用.它应该只切换与事件目标匹配的子菜单子菜单.请帮帮忙. https://jsfiddle.net/d3auwqvb/



<!DOCTYPE html>

<head>
  <title>webpage</title>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <html lang="en" dir="ltr" />
  <link rel="stylesheet" href="css/style.css" />
  <link rel='stylesheet' href="https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css" />
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.2/css/all.min.css" />
</head>

<body>
      <div class="index-list">
        <ul class="index-itself">
          <li class="indexitem1 indexitem"><a href="#">indexitem1</a><i class="fas fa-angle-down indexitem1indexarrow arrow"></i>
            <ul class="indexitem1submenu index-sub-menu hidden">
              <li class="indexitem2 indexitem"><a href="#">indexitem2</a><i class="fas fa-angle-down indexitem2indexarrow arrow"></i>
                <ul class="indexitem2submenu index-sub-menu-sub-menu hidden">
                  <li><a href="#">lorem uipson</a></li>
                </ul>
              </li>
            </ul>      
          </li>
          <li class="indexitem3 indexitem"><a href="#">indexitem3</a><i class="fas fa-angle-down indexitem1indexarrow arrow"></i>
            <ul class="indexitem3submenu index-sub-menu hidden">
              <li class="indexitem4 indexitem"><a href="#">indexitem4</a><i class="fas fa-angle-down indexitem2indexarrow arrow"></i>
                <ul class="indexitem4submenu index-sub-menu-sub-menu hidden">
                  <li><a href="#">lorem uipson</a></li>
                </ul>
              </li>
            </ul>      
          </li>
        </ul>
      </div>
      </body>
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap');

.index-list {
  position: static;
  width: calc(100% - 50%);
word-wrap: break-word;
padding: 10px 20px;
text-align: left;
border: 3px solid #444;
margin: 0px 105px 100px 100px;
box-shadow: #333;
background-color: #ffffff;
font-family: poppins;
font-size: 17px;
}
.index-list li {
  list-style: none;
}
.index-list li a {
  text-decoration: none;
  color: #000;
}
.index-list li i {
  color: #000;
  cursor: pointer;
  font-size: 20px;
}
.index-list .index-itself .index-sub-menu li a {
  position: relative;
  padding-left: 10px;
}
.index-list li i:hover{
  font-size: 22px;
}
.hidden {
  display: none;
}
.rotatearrow {
  transform: rotate(180deg);
}


// Index //

const indexList = document.querySelector('.index-list');
const indexSubmenus = document.querySelectorAll('.index-sub-menu');
const indexSubmenusSubmenus = document.querySelectorAll('.index-sub-menu-sub-menu');

// close all submenu submenus and arrows on submenu arrow click //
indexSubmenus.forEach(submenu =>{
indexSubmenusSubmenus.forEach(submenuSubmenu =>{
submenu.parentElement.children[1].addEventListener('click',(Event)=>{
  if (submenuSubmenu.parentElement.parentElement == Event.target.parentElement){
  this.classList.add('hidden');
  this.parentElement.children[1].classList.remove('rotatearrow')}
    });
  });
});

//

// open submenus and submenu submenus //
openSubmenus = (Event)=>{
  for(let i=0; i < indexSubmenus.length; i++)
  if(indexSubmenus[i].parentElement.children[1] == Event.target){
    Event.target.parentElement.children[2].classList.toggle('hidden');
    Event.target.parentElement.children[1].classList.toggle('rotatearrow');
  }};
openSubmenusSubmenus = (Event)=>{
  for(let i=0; i < indexSubmenusSubmenus.length; i++)
  if(indexSubmenusSubmenus[i].parentElement.children[1] == Event.target){
    Event.target.parentElement.children[2].classList.toggle('hidden');
    Event.target.parentElement.children[1].classList.toggle('rotatearrow');
}};

indexList.addEventListener('click',openSubmenus);
indexList.addEventListener('click',openSubmenusSubmenus);

//

我try 了这个Java脚本,但它不起作用:

indexSubmenus.forEach(submenu =>{
indexSubmenusSubmenus.forEach(submenuSubmenu =>{
submenu.parentElement.children[1].addEventListener('click',(Event)=>{
  if (submenuSubmenu.parentElement.parentElement === Event.target.parentElement){
  this.classList.add('hidden');
  this.parentElement.children[1].classList.remove('rotatearrow')}
    });
  });
});

推荐答案

抱歉,我不能在保留类.hidden的情况下这样做,但是隐藏的HTML属性有类似的效果.

所以我的解决方案是:

// Index //

const indexList = document.querySelector('.index-list');
const indexSubmenus = document.querySelectorAll('.index-sub-menu');
const indexSubmenusSubmenus = document.querySelectorAll('.index-sub-menu-sub-menu');

// close all submenu submenus and arrows on submenu arrow click //
indexSubmenus.forEach(submenu => {
  indexSubmenusSubmenus.forEach(submenuSubmenu => {
    submenu.parentElement.children[1].addEventListener('click', (Event) => {
      if (submenuSubmenu.parentElement.parentElement == Event.target.parentElement) {
        this.setAttribute('hidden', '');
        this.parentElement.children[1].classList.remove('rotatearrow');
      }
    });
  });
});

//

// open submenus and submenu submenus //
openSubmenus = (Event) => {
  for (let i = 0; i < indexSubmenus.length; i++) {
    if (indexSubmenus[i].parentElement.children[1] == Event.target) {
      if (!Event.target.parentElement.children[2].children[0].children[2].hasAttribute('hidden')) {
                Event.target.parentElement.children[2].children[0].children[2].setAttribute('hidden','')
        }
      if(Event.target.parentElement.children[2].hasAttribute('hidden')){
        Event.target.parentElement.children[2].removeAttribute('hidden');
      }
      else{
        Event.target.parentElement.children[2].setAttribute('hidden', '');
      }
      Event.target.parentElement.children[1].classList.toggle('rotatearrow');

    }
  }
};
openSubmenusSubmenus = (Event) => {
  for (let i = 0; i < indexSubmenusSubmenus.length; i++)
    if (indexSubmenusSubmenus[i].parentElement.children[1] == Event.target) {
      if(Event.target.parentElement.children[2].hasAttribute('hidden')){
        Event.target.parentElement.children[2].removeAttribute('hidden');
      }
      else{
        Event.target.parentElement.children[2].setAttribute('hidden','');
      }
      Event.target.parentElement.children[1].classList.toggle('rotatearrow');
    }
};

indexList.addEventListener('click', openSubmenus);
indexList.addEventListener('click', openSubmenusSubmenus);

当我try 使用.hidden类时,问题是识别它的状态,无论它是活动的还是不活动的.我try 使用hasAtrribute("class","hidden"),但它不起作用(可能是因为元素有很多类).也许有人会建议如何go 做. 除非您想保留.hidden,否则此代码将执行您所要求的操作.

希望这能解决你的问题!

Javascript相关问答推荐

为什么它无法识别日期 Select 器上的任何 Select ?

在JS中转换mysql UTC时间字段?

如何解决(不忽略)reaction详尽的linter规则,而不会在获取数据时导致无限的reender循环

Mongodb拥有5亿个文档,我想根据JavaScript驱动程序中的两个字段使用regEx进行搜索,而不是模式

如何避免使用ajax在Vue 3合成API中重定向

如何在加载的元数据上使用juserc和await中获得同步负载?

为什么在获取回调内设置状态(不会)会导致无限循环?

如何通过onClick为一组按钮分配功能;

Bootstrap动态选项卡在切换选项卡后保持活动状态,导致元素堆叠

从mat—country—select获取整个Country数组

还原器未正确更新状态

我正在建立一个基于文本的游戏在react ,我是从JS转换.我怎样才能使变量变呢?

如何将多维数组插入到另一个多维数组中?

IF语句的计算结果与实际情况相反

更改预请求脚本中重用的JSON主体变量- Postman

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

为什么可选参数的顺序会导致问题?

在渲染turbo流之后滚动到元素

在Java脚本中录制视频后看不到曲目

select 2-删除js插入的项目将其保留为选项