【问题标题】:Event delegation with vanilla JS使用 vanilla JS 的事件委托
【发布时间】:2018-07-08 22:05:25
【问题描述】:

基于以下 HTML 标记:

<div class='list-container'>
  <button class="btn">More details </button>
</div>

<div class="details">Lorem ipsum lorem ipsum lorem ipsum</div>

我编写了以下 JavaScript 代码:

let btn = document.querySelector('.btn');
let detailsContainer = document.querySelector('.details');

btn.addEventListener('click', function(e) {
  e.preventDefault();
  detailsContainer.classList.toggle('visible');
});

但我需要更改 JS 代码以使用事件委托,以便将 eventListener 添加到 list-container 而不是 btn。

在 jQuery 中很容易,但是在 vanilla JS 中我怎么做呢?

【问题讨论】:

标签: javascript events event-delegation


【解决方案1】:

只需将侦听器添加到.list-container,然后单击,检查target matches 是否.btn

const detailsContainer = document.querySelector('.details');
document.querySelector('.list-container').addEventListener('click', ({ target }) => {
  if (target.matches('.btn')) detailsContainer.classList.toggle('visible');
});
.details { display: none }
.visible { display: block }
<div class='list-container'>container outside of button
  <button class="btn">More details </button>
</div>

<div class="details">Lorem ipsum lorem ipsum lorem ipsum</div>

【讨论】:

  • 感谢您的解决方案,但如果您的无序列表中有多个项目,则此解决方案仅适用于第一项。
  • @user1941537 我不明白,HTML 中没有列表(有序或无序),无论是在答案中还是在您的问题中......?当然,如果 HTML 不同,Javascript 也需要调整
猜你喜欢
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多