当前位置: 首页 > 知识库问答 >
问题:

如何将列表中的每个项目作为可折叠项目的目标?[副本]

裴理
2023-03-14

我有一个div元素列表,每个元素都包含一个标题和一个正文部分。最初仅显示每个项目的标题,单击时,相应的正文应显示在标题下方。再次单击标题时,主体应消失。我使用的逻辑是在每个列表项上附加/删除类名“extended”,以便通过CSS显示和隐藏正文部分。

现在,我正在尝试创建一个动态脚本,以允许几乎无限的列表条目,而不必专门针对每个条目,但我无法使它适用于所有条目。

HTML

<div class="list-wrapper">
    <div class="chapter chapter-1">
        <div class="chapter-header"></div>
        <div class="chapter-body"></div>
    </div>
    <div class="chapter chapter-2">
        <div class="chapter-header"></div>
        <div class="chapter-body"></div>
    </div>
    <div class="chapter chapter-3">
        <div class="chapter-header"></div>
        <div class="chapter-body"></div>
    </div>
</div>

JavaScript

var chapter = document.getElementsByClassName('chapter')[0];
var chapterHeader = document.getElementsByClassName('chapter-header')[0];

chapterHeader.addEventListener("click", function(){
    chapter.classList.toggle("extended");
});

上面的代码适用于第一项,但显然不适用于其余项。有什么想法吗?我对香草JavaScript代码感兴趣。提前谢谢。

共有3个答案

朱睿
2023-03-14

我相信是这样的

chapterHeader.addEventListener("click", function(this){
        this.nextSibling.classList.toggle("extended");
    });
佘飞鸣
2023-03-14

事件冒泡是关键词。

只向容器添加一个事件。单击容器时,它首先处理内部元素,然后处理外部元素。

let list = document.getElementById("myList");

list.addEventListener("click", function(event) {
  // Do stuff with target
  console.log(event.target.className);

})
<div id="myList" class="list-wrapper">
  <div class="chapter chapter-1">
    <div class="chapter-header">Chapter header 1</div>
    <div class="chapter-body">Chapter body 1</div>
  </div>
  <div class="chapter chapter-2">
    <div class="chapter-header">Chapter header 2</div>
    <div class="chapter-body">Chapter body 2</div>
  </div>
  <div class="chapter chapter-3">
    <div class="chapter-header">Chapter header 3</div>
    <div class="chapter-body">Chapter body 2</div>
  </div>
</div>
漆雕和昶
2023-03-14

您需要使用方法foreach()来处理类的集合。还有方法最接近(),它允许您引用当前元素的指定父级。

尝试以下it代码:

let chapterHeader = document.querySelectorAll('.chapter-header');

chapterHeader.forEach(function(chapterHeader_current, index) {
  chapterHeader_current.addEventListener('click', function() {
    let current_chapter = this.closest('.chapter');
    current_chapter.classList.toggle("extended");
  });
});
 类似资料:
  • 问题内容: 假设我有一个数组/要比较的事物列表。在我更熟悉的语言中,我会做类似的事情 这样可以确保我们只比较每对一次。在某些情况下,我正在对列表中包含的一堆对象进行碰撞检测。对于检测到的每个碰撞,将一个描述碰撞的小的“碰撞”对象添加到列表中,然后另一个例程循环循环以解决每个碰撞(取决于两个碰撞对象的性质)。显然,我只想报告每个碰撞一次。 现在,这样做的pythonic方式是什么,因为Python倾

  • 我有一个方法返回一个

  • 问题内容: 是否可以为列表理解中的每个项目返回2个(或更多)项目? 我想要的(示例): 应该回来 因此,可以替换以下代码块: 问题答案: 时间: 2.69210777094 3.13900787874 1.62461071932 25.5944058287 29.2623711793 25.7211849286

  • 问题内容: 我遇到了我认为应该是一个非常简单的问题。 我需要将arrayList中的每个项目与列表中的其他所有项目进行比较,而无需将项目与其自身进行比较。它不像调用equals()比较那样简单,它涉及一些自定义逻辑,我在下面的代码中省略了这些自定义逻辑。而且,ArrayList不应以任何方式更改。 我似乎遇到的问题是,一旦进入第二个循环,我就不知道是否有另一个对象要与之比较(因为它是一个可变大小的

  • 问题内容: 我刚刚开始使用Java中的列表。我想知道推荐的修改列表中每个元素的方法是什么? 我已经可以通过以下两种方法来完成此任务,但是它们看起来都相当简单。有没有更好的方法可以在Java中完成此操作?是否推荐以下任何一种方法,或者两者都处于同一水平? 问题答案: 第二个版本会更好。在内部,它们最后是相同的,但是第二个实际上允许您修改列表,而第一个将引发ConcurrentModification

  • 问题内容: 我试图使用Eclipse从SVN中签出一个项目。我尝试使用“签出为”将其放入“来自现有Ant脚本的Java项目”中,但是项目向导要求文件已下载。有没有一种方法可以将项目作为Java项目检入Eclipse,而不必先将其下载到其他地方? (我在Subversive中使用Eclipse Ganymade 3.4.1。) 问题答案: 如果未选中作为一个Java项目,您可以添加Java性质如图所