【问题标题】:How to prevent inner div's event handler from executing in outer div's event handler?如何防止内部 div 的事件处理程序在外​​部 div 的事件处理程序中执行?
【发布时间】:2020-04-02 04:32:49
【问题描述】:

我有两个<div>s,一个在另一个内部,每个都有自己的点击处理程序,我希望外部 div 的点击处理程序在用户点击时首先触发。在外部div的点击处理程序内部,我想有条件地检查是否要阻止内部div的点击处理程序执行,这可能吗?

例如在反应中:


<div class="outer" onclick={outerHandler}>

<div class="inner onclick={innerHandler}>

Click Me!

<div>

</div>

const outerHandler = () => { console.log("alert outer"); if (something != something) { //block inner handler from executing}}

const innerHandler = () => {console.log("alert inner")};

【问题讨论】:

    标签: javascript jquery html css reactjs


    【解决方案1】:

    在外层handler中,处理捕获阶段的事件,如果想阻止事件向下传播到内层元素,可以调用stopPropagation

    <div class="outer" onClickCapture={outerHandler}>
    

    (注意onClickCapture的使用——这是必不可少的,它表示事件是在捕获阶段处理的,而不是冒泡阶段)

    然后,在outerHandler

    const outerHandler = (e) => {
      const stopInnerClick = true; // put your desired logic here
      if (stopInnerClick) {
        e.stopPropagation();
      }
    }
    

    还要注意onClick 区分大小写(onclick= 不起作用),您需要一个" 来终止内部class

    直播sn-p:

    const outerHandler = (e) => {
      const stopInnerClick = true; // put your desired logic here
      if (stopInnerClick) {
        console.log('Propagation stopped');
        e.stopPropagation();
      }
    };
    const innerHandler = () => {
      console.log('inner');
    };
    
    class Comp extends React.Component {
      render() {
        return (
          <div class="outer" onClickCapture={outerHandler}>outer
            <div class="inner" onClick={innerHandler}>inner
            </div>
          </div>
        );
      }
    }
    
    ReactDOM.render(
      <Comp />,
      document.body
    );
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>

    【讨论】:

    • 这是一个很好的答案!但是,如果内部 div 的事件处理程序通过 jquery 附加,e.stopPropagation() 似乎不起作用。我想做的是在外部 div 处理程序中设置逻辑,以阻止 jqery 中的一些遗留代码在某些情况下执行
    • 这是一个很奇怪的情况,但如果处理程序真的附加到内部元素,stopPropagation 肯定会工作。如果没有,则处理程序未附加到内部元素 - 发布 minimal reproducible example?
    【解决方案2】:

    在 React 中,您可以根据需要更改状态,然后检查处理程序中的值。

    const state = {
        blockInner: false
    }
    
    const outerHandler = () => { 
        console.log("alert outer"); 
        if (something !== something) {
            this.setState({ blockInner: true });
        }
    }
    
    const innerHandler = () => {
        if (!this.state.blockInner) {
            console.log("alert inner");
        }
    }
    

    【讨论】:

    • 这不起作用,因为setState 是异步的 - 内部处理程序将在状态更改之前运行。为仅在处理当前事件期间重要的事情设置状态也是相当过分的。
    • @CertainPerformance Hrm 也许我误解了这个问题。我认为 OP 不希望在单击 div 时执行两个处理程序,而是在一个处理程序中有一些逻辑来确定是否应该处理稍后对第二个 div 的单击。在这种情况下,setState 是完美的。但是,在重新阅读问题后,我确实发现我误解了。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多