javascript - 点击 "getElementsByClassName"隐藏 div

标签 javascript html css

我尝试在按钮上实现一个事件。 当我使用 .onclick 事件单击它时,我将隐藏另一个 div。

问题是我有一个包含更多具有相同类的 div 的列表,因此代码无法正常工作。

      <article class="content__box">
    <h1 class="content__title">About me</h1>
    <div class="content__hide"><span class="fa fa-minus"></span></div>
    <div class="content__text">
      <p>My text here</p>
    </div>
  </article>
  <article class="content__box">
    <h1 class="content__title">About me</h1>
    <div class="content__hide"><span class="fa fa-minus"></span></div>
    <div class="content__text">
      <p>My text here</p>
    </div>
  </article>

我的想法是,当我点击类“content__hide”时,我将从它所属的元素中隐藏 content__text。

Jsfiddle 链接:https://jsfiddle.net/8ddx3kfz/

提前致谢!

最佳答案

将两个函数中的参数替换为正在更改的内容 block 。正如其他人在评论中所述,getElementsByClassName 将返回一个 HTML 集合而不是一个单一元素。 querySelectorAll(只抓取一个元素)也不会很好用,这就是为什么我建议只传入元素本身。

您再次尝试将事件处理程序添加到 HTML 集合中。您需要使用 Array.from()Array.prototype.forEach.call() 将集合转换为数组以循环遍历并分别为每个集合分配一个处理程序按钮。

在事件处理程序中删除任意变量并检查内容 block 本身的可见性。有很多方法可以找到 block ,但由于它们是直接 sibling this.nextElementSibling 就足够了。最后,您检查它是否被隐藏,无论是内联的还是从您的样式表中。检查样式表的成本有点高,但这是您必须采取的措施,因为 block 最初并未在加载时内联隐藏。

var buttons = document.getElementsByClassName('content__hide');

function hide(content) {
  content.style.display = "none";
}

function show(content) {
  content.style.display = "block";
}

Array.from(buttons).forEach(function(button) {
  button.addEventListener('click', function() {
    var content = this.nextElementSibling;
    var contentIsVisible = content.style.display === 'block' || getComputedStyle(content).display && getComputedStyle(content).display === 'block';

    if (contentIsVisible) {
      hide(content);
    } else {
      show(content);
    }
  });
});
.content__box {
  margin: 20px 0;
}

.content__title {
  font-weight: 400;
  color: #999;
  font-size: 26px;
  font-family: 'Montserrat', sans-serif;
  margin: 0px;
  display: inline-block;
}

.content__hide {
  float: right;
  display: inline-block;
  margin-top: 5px;
  cursor: pointer;
  font-size: 22px;
  color: #999;
}

.content__text {
  background: #fff;
  padding: 12px;
  color: #000;
  margin: 10px 0;
}

.content__text p {
  margin: 0px 0px 12px 0px;
}
<article id="despre" class="content__box">
  <h1 class="content__title">Despre mine</h1>
  <button class="content__hide">Hide</button>
  <div class="content__text">
    <p>Lorem Ipsum este pur şi simplu o machetă pentru text a industriei tipografice. Lorem Ipsum a fost macheta standard a industriei încă din secolul al XVI-lea, când un tipograf anonim a luat o planşetă de litere şi le-a amestecat pentru a crea o carte
      demonstrativă pentru literele respective. Nu doar că a supravieţuit timp de cinci secole, dar şi a facut saltul în tipografia electronică practic neschimbată. A fost popularizată în anii '60 odată cu ieşirea colilor Letraset care conţineau pasaje
      Lorem Ipsum, iar mai recent, prin programele de publicare pentru calculator, ca Aldus PageMaker care includeau versiuni de Lorem Ipsum.</p>
    <p>Lorem Ipsum este pur şi simplu o machetă pentru text a industriei tipografice. Lorem Ipsum a fost macheta standard a industriei încă din secolul al XVI-lea, când un tipograf anonim a luat o planşetă de litere şi le-a amestecat pentru a crea o carte
      demonstrativă pentru literele respective. Nu doar că a supravieţuit timp de cinci secole, dar şi a facut saltul în tipografia electronică practic neschimbată. A fost popularizată în anii '60 odată cu ieşirea colilor Letraset care conţineau pasaje
      Lorem Ipsum, iar mai recent, prin programele de publicare pentru calculator, ca Aldus PageMaker care includeau versiuni de Lorem Ipsum.</p>
  </div>
</article>
<article id="despre" class="content__box">
  <h1 class="content__title">Despre mine</h1>
  <button class="content__hide">Hide</button>
  </div>
  <div class="content__text">
    <p>Lorem Ipsum este pur şi simplu o machetă pentru text a industriei tipografice. Lorem Ipsum a fost macheta standard a industriei încă din secolul al XVI-lea, când un tipograf anonim a luat o planşetă de litere şi le-a amestecat pentru a crea o carte
      demonstrativă pentru literele respective. Nu doar că a supravieţuit timp de cinci secole, dar şi a facut saltul în tipografia electronică practic neschimbată. A fost popularizată în anii '60 odată cu ieşirea colilor Letraset care conţineau pasaje
      Lorem Ipsum, iar mai recent, prin programele de publicare pentru calculator, ca Aldus PageMaker care includeau versiuni de Lorem Ipsum.</p>
    <p>Lorem Ipsum este pur şi simplu o machetă pentru text a industriei tipografice. Lorem Ipsum a fost macheta standard a industriei încă din secolul al XVI-lea, când un tipograf anonim a luat o planşetă de litere şi le-a amestecat pentru a crea o carte
      demonstrativă pentru literele respective. Nu doar că a supravieţuit timp de cinci secole, dar şi a facut saltul în tipografia electronică practic neschimbată. A fost popularizată în anii '60 odată cu ieşirea colilor Letraset care conţineau pasaje
      Lorem Ipsum, iar mai recent, prin programele de publicare pentru calculator, ca Aldus PageMaker care includeau versiuni de Lorem Ipsum.</p>
  </div>
</article>

关于javascript - 点击 "getElementsByClassName"隐藏 div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47833564/

相关文章:

javascript - 如果页面没有完全加载,是否可以重新加载webview?

javascript - 使用图形 API 从浏览器将视频发布到 Facebook

javascript - 限制使用 Meteor blaze 输出的文本数量

css - 我在使用 Github 推送 cmd 时无法创建代理

javascript - 等待折叠动画后在按钮之间切换

python - 为什么我会收到这个(显然)不寻常的 AttributeError : 'bytes' object has no attribute '_all_strings' ? 有没有办法解决它?

javascript - 当类在视口(viewport)中时显示元素

javascript - contenteditable 单行输入

html - 为不规则形状的图像添加边框

javascript - 将 Node 流转换为 Rx.js Observables