[解決済み] ReactJS SyntheticEvent stopPropagation()は、Reactイベントでのみ動作するのですか?
質問
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();
});
});
解決方法は?
Reactでは、イベントデレゲーションにより
document
この例では、'click' のようなバブルイベントに対して、伝搬を止めることができないことを意味します。
stopPropagation
Reactの合成イベントの伝搬は、Reactが内部で処理しているため、Reactの合成イベントの伝搬は可能です。
作業内容 JSFiddle を以下のように修正しました。
jQueryイベントのReactストッププロパゲーション
使用方法
Event.stopImmediatePropagation
を使用すると、ルート上の他の (この場合は jQuery の) リスナーが呼び出されるのを防ぐことができます。IE9+とモダンブラウザでサポートされています。
stopPropagation: function(e){
e.stopPropagation();
e.nativeEvent.stopImmediatePropagation();
},
- 注意:リスナーはバインドされた順番に呼び出されます。これが動作するためには、他のコード(ここではjQuery)の前にReactを初期化する必要があります。
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のソースに説明的なコメントがあります。 ReactBrowserEventEmitter.js .
関連
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
Vueの要素ツリーコントロールに破線を追加する説明
-
vue3.0プロジェクトのアーキテクチャを構築するための便利なツール
-
vueにおけるfilterの適用シーンについて解説します。
-
Vueのフィルタの説明
-
[解決済み】GETできない / Nodejsエラー
-
[解決済み】TypeError: Router.use() はミドルウェアの関数を要求しているが、Object を取得した。
-
[解決済み] Web API エラー - このリクエストはブロックされました; コンテンツは HTTPS で提供されなければなりません
-
[解決済み】React - TypeError: 未定義のプロパティ 'props' を読み取ることができない。
-
[解決済み】React-Redux: アクションはプレーンオブジェクトでなければならない。非同期アクションにはカスタムミドルウェアを使用する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
vue3レスポンシブ対応のためのsetup+ref+reactive
-
Vue+ElementUIによる大規模なフォームの処理例
-
vueのグローバルがscss(mixin)を導入。
-
vueの補間表現とv-textディレクティブの違いについて
-
[解決済み】React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み】Uncaught SyntaxError: JSONの位置0に予期しないトークンuがあります。
-
[解決済み】JavaScriptの配列でforEachが関数でない不具合
-
[解決済み】TypeErrorの解決方法。未定義またはヌルをオブジェクトに変換できない
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
フロントエンド null のプロパティ 'disabled' を読み取れない 問題が解決された