ReactJSコンポーネント内でevent.stopPropagation()を使用して、レガシーコードでJQueryに添付されたクリックイベントが発生し、クリックイベントがトリガーされるのを停止しようとしていますが、ReactのstopPropagation()がイベントへの伝播を停止するだけのようですReactにもアタッチされており、JQueryのstopPropagation()は、Reactにアタッチされたイベントへの伝播を停止しません。
これらのイベントでstopPropagation()を機能させる方法はありますか?これらの動作を示すために、簡単なJSFiddleを作成しました。
/** @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();
});
});
stopImmediatePropagation
クレームイベントリスナーは、バインドされた順に呼び出されます。React JSがjQueryの前に初期化されている場合(フィドルのように)、即時伝搬を停止することで機能します。
componentDidMount
ことですが、予期しない方法で他のReactイベントハンドラーに干渉する可能性があります。
.stop-propagation
必ずしも機能しないことに気付きました。あなたの例はイベント委譲を使用していますが、要素で伝播を停止しようとしています。リスナーは要素自体にバインドする必要があります:$('.stop-propagation').on('click', function(e) { e.stopPropagation(); });
。このフィドルは、あなたがしようとしていたようなすべての伝播を防ぎます:jsfiddle.net/7LEDT/6
event.nativeEvent.stopImmediatePropagation
して他のイベントリスナーが起動しないようにすることができますが、実行順序は保証されません。