javascript - 如果您在模态中开始或结束单击事件,如何防止简单的 React 模态被关闭?

标签 javascript reactjs events modal-dialog

我看了很多React制作的模态,很多似乎都有这个问题,所以我整理了一个simple example in jsFiddle来演示问题。

代码片段中的代码:

handleOutsideClick = e => {
    if (e.target.id === "modal-view-info") {
      this.props.closeSelf();
    }
}

基本上,它可以工作(在模式外部单击将其关闭)。问题是我想让它只有在单击事件在模态之外开始和结束时才关闭。也就是说,如果您在模态之外启动 mousedown,但将其拖动到相应 mouseup 的模态内部,则模态不应关闭。同样,如果您在模式内部开始单击并在模式外部结束单击,则它不应关闭。

我已经搞乱它有一段时间了,我相信问题是浏览器将点击事件中的 e.Target 视为父元素。也就是说,如果您开始在子元素内部单击,然后在父元素内部释放鼠标按钮,则 e.Target 将成为父元素。在相反的情况下,e.Target 也将是父元素。这让事情变得棘手。

是否可以修改代码片段以合并此功能?我已经在我的代码库中使用了这个模态代码,所以我更愿意修复这个问题,而不是采用完全不同的设计。

最佳答案

不要监听整个模式上的点击事件。相反,在模态后面放置一个隐藏的 div,它将捕获仅在模态之外的点击。

CSS

.modal-close {
  position: absolute;
  left: 0;
  top: 0;
  right: 0;
  bottom: 0;
}

组件

class Modal extends React.Component {
  constructor(props) {
    super(props);

    }

  render() {
    return (
      <div>
        <div id="modal-view-info" className="modal" >
          <div className="modal-close" onClick={this.props.closeSelf} />
          <div className="modal-content">
            Hello how are you doing?
            Well I hope!
          </div>
        </div>
      </div>
    )
  }
}

https://jsfiddle.net/vdwr7Lg5/

关于javascript - 如果您在模态中开始或结束单击事件,如何防止简单的 React 模态被关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57518294/

相关文章:

c# - 在 C# 中,您可以对事件设置约束吗?

javascript - 基于视口(viewport)高度的动态高度

javascript - 语音转文字识别不准确

reactjs - Redux:集合中项目的派生数据

javascript - UseState、UseEffect 不更新 reactjs 中的状态。我正在尝试将随机数添加到状态

amazon-web-services - aws cloudformation s3 向 SQS 发出的事件通知不起作用

javascript - HTML:停止在 div 中呈现 HTML 代码

javascript - 程序在 JavaScript 中抛出 'Access-Control-Allow-Origin' header ?在 Postman 中工作,而不是通过浏览器

javascript - ForEach 不更新主数组

events - ZF2 共享模块事件管理器