我是一个新手,我正在try 创建一个页面,其中条目标题将出现在左侧(侧边栏),当点击时,内容将出现在右侧(主页面).问题是,内容显示在标题的正下方,而不是旁边. 我试着将内容更改为它应该在的div,但当我点击标题时,甚至没有任何react .有什么办法解决这个问题吗?

var entries = document.querySelectorAll(".entry");
for (var i = 0; i < entries.length; i++) {
  var el = entries[i];
  el.addEventListener("click", function () {
    var itemId = i;
    var allEntries = document.querySelectorAll(".entry");
    if (this.nextElementSibling.className.match("show")) {
      this.nextElementSibling.classList.remove("show");
    } else {
      this.nextElementSibling.classList.add("show");
    }
    for (var j = 0; j < allEntries.length; j++) {
      if (this == allEntries[j]) {
        continue;
      }
      allEntries[j].nextElementSibling.classList.remove("show");
    }
  });
}
.entry {
  color: #d49a95;
  cursor: pointer;
  padding: 10px;
}

.entry-content {
  display: none;
}

.show {
  display: block;
}
<div class="main">
  <div class="sidenav">
    <div class="entry">test</div>
    <div class="entry">test2</div>
  </div>
  <main>
    <center>
      <p class="entry-content">helloo</p>
      <p class="entry-content">hiiii</p>
    </center>
  </main>
</div>

推荐答案

问题在于,您使用的是所单击的.entry个元素中的nextElementSibling()个元素,但它们没有sibling 元素.从问题的描述看,您似乎正在try 访问相关的.entry-content个元素,但它们是.entry的父元素的同级的子元素.

为了简化问题,您可以通过它们各自的父元素中的索引将它们关联起来,如下所示:

const entries = document.querySelectorAll(".entry");
const contents = document.querySelectorAll('.entry-content');

const getChildIndex = el => [].indexOf.call(el.parentNode.children, el);
const hideAllContent = () => contents.forEach(c => c.classList.remove('show'));

entries.forEach(entry => {
  entry.addEventListener('click', e => {
    hideAllContent();
    
    const index = getChildIndex(e.target);
    contents[index].classList.add('show');
  });
});
.entry {
  color: #d49a95;
  cursor: pointer;
  padding: 10px;
}

.entry-content {
  display: none;
}

.show {
  display: block;
}
<div class="main">
  <div class="sidenav">
    <div class="entry">test</div>
    <div class="entry">test2</div>
  </div>
  <main>
    <center>
      <p class="entry-content">helloo</p>
      <p class="entry-content">hiiii</p>
    </center>
  </main>
</div>

或者,您可以在.entry个元素上使用data个属性来直接指定应该显示哪.entry-content个元素:

const entries = document.querySelectorAll(".entry");
const contents = document.querySelectorAll('.entry-content');
const hideAllContent = () => contents.forEach(c => c.classList.remove('show'));

entries.forEach(entry => {
  entry.addEventListener('click', e => {
    hideAllContent();
    document.querySelector(e.target.dataset.content).classList.add('show');
  });
});
.entry {
  color: #d49a95;
  cursor: pointer;
  padding: 10px;
}

.entry-content {
  display: none;
}

.show {
  display: block;
}
<div class="main">
  <div class="sidenav">
    <div class="entry" data-content="#content-a">test</div>
    <div class="entry" data-content="#content-b">test2</div>
  </div>
  <main>
    <center>
      <p class="entry-content" id="content-a">helloo</p>
      <p class="entry-content" id="content-b">hiiii</p>
    </center>
  </main>
</div>

另外,使用像cursor: pointer这样的东西来使不可点击元素的行为像可点击元素一样是一种糟糕的做法.我强烈建议您将.entry个元素更改为<a />,如果您不想让链接真正指向任何地方,请拨打preventDefault().

Javascript相关问答推荐

从连接字符串创建客户端时,NodeJS连接到CosmosDB失败

容器如何更改默认插槽中子项的显示?

D3多线图显示1线而不是3线

如何在使用fast-xml-parser构建ML时包括属性值?

如何将连续的十六进制字符串拆分为以空间分隔的十六进制块,每个十六进制块包含32个二元组?

调用removeEvents不起作用

将状态向下传递给映射的子元素

如何修复(或忽略)HTML模板中的TypeScript错误?'

colored颜色 检测JS,平均图像 colored颜色 检测JS

如何从URL获取令牌?

使用LocaleCompare()进行排序时,首先使用大写字母

如何从网站www.example.com获取表与Cheerio谷歌应用程序脚本

Prisma具有至少一个值的多对多关系

使用Java脚本导入gltf场景并创建边界框

覆盖TypeScrip中的Lit-Element子类的属性类型

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

如何在和IF语句中使用||和&;&;?

如何在尚未创建的鼠标悬停事件上访问和着色div?

如何调整下拉内容,使其不与其他元素重叠?

使用python,我如何判断一个html复选框是否被隐藏,以及它是否被S选中?