preventDefault()
とstopPropagation()
のメモ
Eventの処理で使う
双方イベントリスナー内で使うことが多い。というかほとんど。イベントインターフェースのメソッドだからリスナーで処理するだろう。
stopPropagation
が必要なところでうっかりpreventDefault
にしていたので、整理するためにこの記事でデモを設置し、メモをしておく。
preventDefault
preventDefault
メソッドは呼び出されると、ブラウザの規定動作を防ぐ(キャンセルする)。フォーム入力など見た目が変更されるときに使うことが多い。
preventDefault()
が動作するイベントかどうかはevent.cancelable
を読み取れば分かる。これがfalse
であるときにpreventDefault()
をしても効果はない。
stopPropagation()
と同じ効果はないので、子要素のイベントリスナーの呼び出し終了後に、親要素のイベントリスナーは呼び出されることになる。イベントの伝播(バブリング)が普通に起こるということ。
stopPropagation
stopPropagation
メソッドは呼び出されると、親要素のイベントリスナーの呼び出しなどのイベントの伝播を防ぐ。ブラウザの規定動作は防がない。
onclick
などのイベントリスナーを親子関係にある要素で設定すると必要になることが多いと思う。設定しない場合は、子のイベントリスナーの実行後に親のも実行されてしまう。下のデモの上半分の部分で色々クリックするとよく分かる。
デモ
stopPropagation()
とpreventDefault()
の動作についてざっくりとしたデモを作ったので置いておく。
上半分は、stopPropagation
のデモ。ボタン
とボタン2
とtomato
色のdiv
をそれぞれ押してみると、alert()
で伝播の様子がわかる。
ボタン
ではpreventDefault()
を実行したあとにalert()
を実行し、ボタン2
ではalert()
のみ実行する。そして、それらを内包するdiv
は、クリックするとalert()
が呼ばれる。このため、ボタン2
の押下時にはalert()
が2回表示される。
下半分は、preventDefault
のデモ。textarea
に文字の入力ができるが、preventDefault()
を利用してe
だけ入力できないようにしている。
e
を入力したときのtextarea
のデフォルト動作(入力文字がフィールドに挿入される動作)を防いでいることがわかる。
一部のブラウザでは正しく動作しないかもしれない(Safari 13.1
では動かないのを確認済み)
See the Pen stopPropagation and preventDefault by ikapper (@ikapper) on CodePen.
おわり
同時利用するケースをデモでは作っていないが、単純に組み合わせれば普通に動くんじゃないかと思う。
React
で使ったことを書き忘れていたが、普通のJavascript
でも同じはず。
何か書き加えることができたら追記したい。
以上です。
広告(Javascript
関連書籍)