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();
});
});
ベストアンサー1
React は、この例の「クリック」のようにバブリングするイベントに対して、単一のイベント リスナーをオンにしたイベント委任を使用しますdocument
。つまり、伝播を停止することはできません。React でイベントを操作するまでに、実際のイベントはすでに伝播しています。ReactstopPropagation
の合成イベントをオンにすることは可能です。これは、React が合成イベントの伝播を内部で処理するためです。
働くJSFiddle以下の修正を加えます。
React が 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 のソースに説明的なコメントがあります。React ブラウザイベントエミッター.js。