javascript - 监听某个父元素和某个子元素之间的事件

标签 javascript reactjs dom-events

我有一个覆盖整个窗口的模态,但这只是因为需要在 .open.modal 上设置的模态背景变暗。 HTML 看起来像这样:

<div class="modals">
  <div class="open modal">
    <div class="modal_inner">
      <div class="white">
        <div class="x"><img src="/assets/meeting/close.png"></div>
        <div class="all">
            <!-- ALL CONTENT HERE -->
        </div>
      </div>
    </div>
  </div>
  <div class="open modal">
    <!-- OTHER MODAL CAN BE OPEN ON TOP -->
  </div>
</div>

当用户点击 .white 外部(.open.modal 或以上)时,我想关闭模式。

如何注册一个 Javascript 事件,如果在父级(在本例中为 body 或波纹管)和子级(在本例中为 .white)之间单击,该事件将触发?

我在 React 中有这个。

最佳答案

有两种标准方法可以实现它:

多个处理程序

  1. Hook click.open.modal 并在那里完成实际工作

  2. click 钩在 .white 上并防止冒泡,因此对 .white 的点击不会到达 .open .modal,因此不会触发其处理程序

例如:

handleOpenModalClick(event) {
    // Do the work
}
handleWhiteClick(event) {
    event.stopPropagation();
}

示例:

class Example extends React.Component {
  handleOpenModalClick(event) {
    // Do the work
    console.log("Do it");
  }
  handleWhiteClick(event) {
      event.stopPropagation();
  }
  render() {
    return (
      <div>
        <div className="open modal" onClick={this.handleOpenModalClick}>
          <div className="white" onClick={this.handleWhiteClick}>
            xxx
          </div>
        </div>
      </div>
    );
  }
}

ReactDOM.render(
  <Example />,
  document.getElementById("react")
);
.open.modal {
  background: #ccc;
  padding: 20px;
}
.white {
  background: white;
}
<div id="react"</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

收到事件后过滤

钩住.open.modal上的click,收到后,检查event.target.open之间的元素。 modal 并检查 .white 是否存在。如果是这样,请不要做这项工作。

handleClick(event) {
    let node = event.target;
    while (node && node !== event.currentTarget) {
        if (node.classList.contains("white")) {
            return; // Skip it
        }
    }
    // Do the work
}

示例:

class Example extends React.Component {
  handleClick(event) {
    let node = event.target;
    while (node && node !== event.currentTarget) {
      if (node.classList.contains("white")) {
        return; // Skip it
      }
    }
    // Do the work
    console.log("Do it!");
  }
  render() {
    return (
      <div>
        <div className="open modal" onClick={this.handleClick}>
          <div className="white">
            xxx
          </div>
        </div>
      </div>
    );
  }
}

ReactDOM.render(
  <Example />,
  document.getElementById("react")
);
.open.modal {
  background: #ccc;
  padding: 20px;
}
.white {
  background: white;
}
<div id="react"</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

关于javascript - 监听某个父元素和某个子元素之间的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43574482/

相关文章:

javascript - 使用ajax动态刷新jquery数据表

javascript - 为什么这些图像在使用 JQuery 时没有循环显示?

javascript - Google map API V3 和 Internet Explorer

javascript - 从箭头函数定义变量和返回组件

reactjs - React Click 事件不会在移动设备上触发

javascript - 你如何在 ReactJS 中悬停? - 快速悬停期间未注册 onMouseLeave

javascript - 无法在选择元素中进行 onchange 工作

javascript - 当特定元素具有相同的类名时,如何获取 jQuery 函数来处理它们?

javascript - 我可以在 semantic-ui-react 卡中添加另一个组件而不破坏它吗?

javascript - 捕获 <select> 列表中的事件