停止传播事件侦听器点击,但仍允许元素内发生其他点击事件

Stop propogation of event listener click but still allow other click events to occur within the element

我创建了一个相当经典的模态框。修复了屏幕中间的模态。半透明背景,中间有一个方框。

该框包含一些点击事件侦听器(例如关闭 X 和执行其他操作的按钮)。

我想允许用户通过单击 外部 背景来关闭模式。

HTML 例子

<div class="modal">
    <div class="modal__inner">
        <div class="modal_closebtn">X</div>
    </div>
</div>

目前,我有以下方法来处理基于点击 .modal 关闭模式,它覆盖了整个屏幕。

document.querySelector(".modal").addEventListener("click", () => {
    this.toggleModal();
});

我的问题是,如果您也在 .modal__inner 内部单击,则会触发此事件。

所以我尝试将 eventListener 添加到 stopPropagation()

document.querySelector(".modal__inner").addEventListener("click", e => {
    e.stopPropagation();
});

这现在阻止了我的 .modal_closebtn 和模态内发生的任何其他事件的 eventListener。

如何确保点击背景 div 仅适用于 modal div 而不是 modal__inner 或任何其他?不幸的是,当我在 div 内部点击后查看 e.currentTarget 时,它 returns .modal 而不是 .modal__inner,尽管看起来我确实在 div 内部点击了.

非jQuery解决方案请

事件对象具有事件的原始 target,使用它来确定事件的来源。

var modal = document.querySelector(".modal");
modal.addEventListener("click", (e) => {
    if (e.target !== modal) return;
    this.toggleModal();
});

为了避免 querySelector 执行太多次并获得一点性能,将结果存储到一个变量中。

var elem = document.querySelector(".modal")
elem.addEventListener("click", (e) => {
  if (e.target !== elem) return;
  console.log('toggle!');
  //this.toggleModal();
});
.modal {
  width: 300px
  height: 300px;
  border: 1px solid #000
}

.modal__inner {
  width: 100px
  height: 100px;
  border: 1px solid red
}
<div id="hola" class="modal">
  Parent modal
  <br>
  <br>
 
  <br>
  <div id="epale" class="modal__inner">
    Inner modal
    <div class="modal_closebtn">X</div>
  </div>
</div>

编码愉快!