ReactJS SyntheticEvent stopPropagation()仅适用于React事件?

我试图在ReactJS组件中使用event.stopPropagation()来停止一个点击事件冒泡并触发一个点击事件,这个点击事件是在传统代码中使用JQuery附加的,但是好像React的stopPropagation()只停止传播到事件也附加在React中,而JQuery的stopPropagation()不会停止传播到React附带的事件。

有什么办法让stopPropagation()在这些事件中工作? 我写了一个简单的JSFiddle来演示这些行为:

http://jsfiddle.net/7LEDT/3/

/** @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(); }); }); 

React使用事件委托与document的单个事件监听器来处理冒泡的事件,如本例中的“click”,这意味着停止传播是不可能的; 真正的事件已经在您与React交互的时候传播了。 在React的综合事件上停止传播是可能的,因为React在内部处理合成事件的传播。

从下面修复JSFiddle: http : //jsfiddle.net/7LEDT/6/

反应停止在jQuery事件传播

使用Event.stopImmediatePropagation来防止你的其他(在这个例子中是jQuery)监听器被调用。 它支持IE9 +和现代浏览器。

 stopPropagation: function(e){ e.stopPropagation(); e.nativeEvent.stopImmediatePropagation(); }, 
  • 警告:听众按照被绑定的顺序被调用。 React必须在其他代码(jQuery在这里)之前初始化,以使其工作。

jQuery停止在React事件上传播

您的jQuery代码也使用事件委托,这意味着在处理程序中调用stopPropagation不会停止任何操作; 事件已经传播到document ,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的源代码有描述性评论: https : //github.com/facebook/react/blob/3b96650e39ddda5ba49245713ef16dbc52d25e9e/src/renderers/dom/client/ReactBrowserEventEmitter.js#L23

我昨天遇到了这个问题,所以我创build了一个React友好的解决scheme。

看看react-native-listener 。 到目前为止它工作得很好。 反馈赞赏。

我能够通过将以下内容添加到我的组件来解决此问题:

 componentDidMount() { ReactDOM.findDOMNode(this).addEventListener('click', (event) => { event.stopPropagation(); }, false); } 

更新:您现在可以<Elem onClick={ proxy => proxy.stopPropagation() } />