如何防止内部div的事件处理程序在外​​部div的事件处理程序中执行?

时间:2019-12-09 04:44:03

标签: javascript jquery html css reactjs

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

例如在react中:


<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")};

2 个答案:

答案 0 :(得分:1)

在外部处理程序中,在捕获阶段处理事件,然后,如果要防止事件向下传播到内部元素,则可以在事件上调用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

实时摘要:

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>

答案 1 :(得分:0)

在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");
    }
}