Javascript ReactEvent stopPropagation()仅适用于React事件?
我试图在ReactJS组件中使用event.stopPropagation()来阻止click事件冒泡并触发旧代码中与JQuery一起附加的click事件,但React的stopPropagation()似乎只停止传播到同样附加在React中的事件,而JQuery的stopPropagation()则停止传播不会停止传播到附加了React的事件 有没有办法让stopPropagation()在这些事件中工作?我写了一个简单的例子来演示这些行为:Javascript ReactEvent stopPropagation()仅适用于React事件?,javascript,jquery,reactjs,Javascript,Jquery,Reactjs,我试图在ReactJS组件中使用event.stopPropagation()来阻止click事件冒泡并触发旧代码中与JQuery一起附加的click事件,但React的stopPropagation()似乎只停止传播到同样附加在React中的事件,而JQuery的stopPropagation()则停止传播不会停止传播到附加了React的事件 有没有办法让stopPropagation()在这些事件中工作?我写了一个简单的例子来演示这些行为: /** @jsx React.DOM */ var
/** @jsx React.DOM */
var Propagation = React.createClass({
alert: function(){
alert('React Alert');
},
stopPropagation: function(e){
e.stopPropagation();
},
render: function(){
return (
<div>
<div onClick={this.alert}>
<a href="#" onClick={this.stopPropagation}>React Stop Propagation on React Event</a>
</div>
<div className="alert">
<a href="#" onClick={this.stopPropagation}>React Stop Propagation on JQuery Event</a>
</div>
<div onClick={this.alert}>
<a href="#" className="stop-propagation">JQuery Stop Propagation on React Event</a>
</div>
<div className="alert">
<a href="#" className="stop-propagation">JQuery Stop Propagation on JQuery Event</a>
</div>
</div>
);
}
});
React.renderComponent(<Propagation />, document.body);
$(function(){
$(document).on('click', '.alert', function(e){
alert('Jquery Alert');
});
$(document).on('click', '.stop-propagation', function(e){
e.stopPropagation();
});
});
/**@jsx React.DOM*/
变量传播=React.createClass({
警报:函数(){
警报(“反应警报”);
},
停止播放:功能(e){
e、 停止传播();
},
render:function(){
返回(
);
}
});
React.renderComponent(,document.body);
$(函数(){
$(文档).on('click','.alert',函数(e){
警报(“Jquery警报”);
});
$(文档)。在('单击','停止传播')上,函数(e){
e、 停止传播();
});
});
React在文档
中对冒泡的事件使用带有单个事件侦听器的事件委派,如本例中的“单击”,这意味着无法停止传播;当您在React中与真实事件交互时,真实事件已经传播<代码>对React的合成事件停止传播是可能的,因为React在内部处理合成事件的传播
使用下面的修复程序。
在jQuery事件上停止传播
用于防止根目录上的其他(本例中为jQuery)侦听器被调用。IE9+和现代浏览器都支持它
stopPropagation: function(e){
e.stopPropagation();
e.nativeEvent.stopImmediatePropagation();
},
- 警告:侦听器是按绑定顺序调用的。React必须在其他代码(此处为jQuery)之前初始化,才能工作
stopPropagation
不会停止任何操作;事件已传播到文档
,将触发React的侦听器
// Listener bound to `document`, event delegation
$(document).on('click', '.stop-propagation', function(e){
e.stopPropagation();
});
要防止传播到元素之外,侦听器必须绑定到元素本身:
// Listener bound to `.stop-propagation`, no delegation
$('.stop-propagation').on('click', function(e){
e.stopPropagation();
});
编辑(2016/01/14):澄清了授权仅适用于存在泡沫的事件。有关事件处理的更多详细信息,React的源代码有描述性注释:。我昨天遇到了这个问题,所以我创建了一个React友好的解决方案
退房。到目前为止,它运行得很好。感谢反馈。我通过在组件中添加以下内容来解决此问题:
componentDidMount() {
ReactDOM.findDOMNode(this).addEventListener('click', (event) => {
event.stopPropagation();
}, false);
}
更新:您现在可以
proxy.stopPropagation()}/>
这仍然是一个有趣的时刻:
ev.preventDefault()
ev.stopPropagation();
ev.nativeEvent.stopImmediatePropagation();
使用这种结构,如果您的函数是由标记包装的,那么值得注意的是,如果您要将事件附加到文档中,e.stopPropagation()
,将不会有任何帮助。作为一种解决方法,您可以使用window.addEventListener()
而不是document.addEventListener
,然后event.stopPropagation()
将停止事件传播到窗口。来自:
下面的事件处理程序是由冒泡阶段的事件触发的。要为捕获阶段注册事件处理程序,append capture。(增加重点)
如果您的React代码中有一个click事件侦听器,并且您不希望它冒泡,那么我认为您要做的是使用onClickCapture
而不是onClick
。然后将事件传递给处理程序并执行event.nativeEvent.stopPropagation()
,以防止本机事件冒泡到普通JS事件侦听器(或任何未响应的事件).一个快速解决方法是使用窗口。addEventListener
而不是文档。addEventListener
将17个委托事件反应到根而不是文档,这可能会解决问题。
更多详细信息。React的实际事件侦听器也位于文档的根目录下,这意味着单击事件已经冒泡到根目录下。您可以使用event.nativeEvent.stopImmediatePropagation
来防止其他事件侦听器触发,但执行顺序不受保证。实际上,将按绑定顺序调用声明事件侦听器。如果您的React JS在jQuery之前初始化(就像在您的小提琴中一样),停止立即传播将起作用。React停止调用jQuery侦听器:jQuery不可能阻止调用React,因为jQuery侦听器稍后会在您的小提琴中绑定。一个选项是在componentDidMount
中设置您自己的jQuery事件处理程序,但它可能会以意外的方式干扰其他React事件处理程序。我意识到上的第二个示例。停止传播必然不起作用。您的示例使用事件委派,但试图在元素处停止传播。侦听器需要绑定到元素本身:$('.stop propagation').on('click',函数(e){e.stopPropagation();})代码>。此小提琴像您尝试的那样阻止所有传播:@ssorellen:diacription:React是将其事件侦听器绑定到文档上还是根React组件上?只是说“在顶层”,我认为这意味着它不是文档
(但我不知道这是否相关)。@FighterJet,这取决于事件类型。对于冒泡的事件,使用顶级委派。对于不冒泡的事件,React必须侦听各种DOM节点。更彻底的描述