javascript - React 中的事件冒泡不会停止使用 e.preventDefault()

标签 javascript reactjs ecmascript-6 dom-events

我有一个<input><th>下,输入有 onChange事件,但是当单击输入时 click事件正在 <th> 上触发标签。如何停止click事件从 DOM 树向上到达父事件监听器?

const App = () => (
  <div style={styles}>
    <table>
      <th onClick={()=>alert('fire')}>
        name
        <input onChange={e=>{e.preventDefault();alert('change text')}}/>
      </th>
    </table>
  </div>
);

尝试激活输入 https://codesandbox.io/s/wq3rj2m00w

最佳答案

所以问题是,当您尝试通过单击输入来关注输入时,会在输入上触发 onClick 事件并将其传播到父级,

您有两种可能的解决方案:

首先:在输入上添加 onClick 事件并在事件的 stopPropagation 上添加。

const App = () => (
  <div style={styles}>
    <table>
      <th onClick={()=>alert('fire')}>
        name
        <input onClick={(e) => {e.stopPropagation()}} onChange={e=>{alert('change text')}}/>
      </th>
    </table>
  </div>
);

第二:在执行操作之前检查 onClick 事件中的目标

const App = () => (
  <div style={styles}>
    <table>
      <th onClick={(e)=>{if(e.target.id !== 'input') {alert('fire')}}}>
        name
        <input id="input" onChange={e=>{alert('change text')}}/>
      </th>
    </table>
  </div>
);

关于javascript - React 中的事件冒泡不会停止使用 e.preventDefault(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47837494/

相关文章:

javascript - HammerJS 与 Meteor 和 ReactJS 集成

reactjs - 为什么 ReactJS 渲染的 HTML 充满了空白?

javascript - 如何拦截 then 或 catch 中的 Promise 响应?

javascript - 如何在 Titanium PickerRow 中添加自定义属性?

javascript - 菜单关闭 Canvas 错误移动

javascript - 谷歌浏览器不尊重缓存控制中的最大年龄

reactjs - 如何在 typescript 中正确使用 Formik 的 useField 钩子(Hook)

javascript - 参数未知时的 Cypher MATCH 请求

javascript - 我可以在一行中重新导出默认值和导入的命名变量吗?

java - 使用 GWT 检查图像的大小