React鼠标事件在没有监听它们的组件上触发
React mouse events fired on components not listening for them
不确定这是我对React事件的深刻误解还是一个实际的错误,但在父母身上注册的鼠标事件有时会在孩子身上触发。
在下面的bin中,在两个div周围拖动鼠标最终会导致内部div变为红色,即使它没有用于附加ui悬停类的事件触发器(尽管它的父级有)。
http://jsbin.com/vemopo/1/edit?css,js,输出
这似乎取决于鼠标移动的速度。我的猜测是,当事件被触发时,event.target
会变成鼠标下的任何东西。因此,它在输入父div时会触发,但如果鼠标移动得很快,那么在处理事件处理程序时,它可能已经在子div上悬停了。
(更新答案)
正如@Stan所评论的,用event.currentTarget
替换event.target
是最简单的修复方法,它将针对侦听器触发事件的元素,而不是鼠标下的元素。
(原始答案/其他选项)
您也可以在父div上设置ref="target"
,然后使用ref而不是事件目标。
_mouseEnter: function(event) {
this.refs.target.getDOMNode().classList.add('ui-hover');
},
然而,最好避免像这样触摸DOM。在这种情况下,您可以在事件处理程序中使用setState,并根据this.state
使用条件来给出不同的结果。
_mouseEnter: function(event) {
this.setState({
hovering: true
});
}
相关文章:
- 如何在AngularJS中监听点击事件,而不是触摸事件
- BackboneJS-监听嵌套的模型更改
- 在Firefox restartless插件中,当一个新窗口打开时,我如何运行代码(监听窗口打开)
- 监听touchend有时会触发移动点击事件
- 使用ajax的Django jquery.如何让jquery监听id's生成的表单
- JQuery监听点击并使用点击元素发出警报's href
- jQuery有没有,或者有没有jQuery插件,内置了监听CSS3动画事件的功能(例如animationEnd)
- 如何让Google Maps API v3监听dragend事件并在投递时填充表单字段
- 如何在angular js中监听dom就绪事件
- Phonegap:监听页面并关闭InAppBrowser返回index.html的简单方法
- React鼠标事件在没有监听它们的组件上触发
- 监听发布到网站的广告的新网址
- 我应该使用什么模式在 Node/JavaScript 中制作监听机器人
- 如何在具体化 CSS 中监听<选择>更改事件
- 监听来自动态创建的组件的事件
- React.js关于监听组件窗口事件的最佳实践
- 监听相同redux状态的组件级别
- AngularJS 1.5中的组件不监听$scope中的广播事件
- 设置React组件来监听socket.io
- 直接监听组件中的回流操作