web関連

【js】mouseover()とmouseover()のバブリングについて

バブリングっていうのがあるということで調べた時の備忘録

バブリングとは

まずは、デモを見た方が早いかも

デモ(何度も大きくなったり小さくなったりする)

ソースコードは以下

<div class="parent">
	親です
	<div class="child">子供です</div>
</div>
<script>
jQuery(function($){
	$('.parent').mouseover(function() {
		$(this).animate({fontSize : '25px'}, 500);
	}).mouseout(function() {
		$(this).animate({fontSize : '15px'}, 500);
	});
});
</script>

デモを見てもらってわかるように何回も大きくなったり小さくなったりしているけど、これがイベントバブリングと呼ばれるものみたい
子要素で発生したmouseoverイベントやmouseoutイベントが親要素に伝播してアニメーションが複数回繰り返されているんだと

いまいちよくわからないから自分の言葉で言わせてもらえれば、「子供です」「親です」それぞれにイベントあってそれぞれマウスホバーするとホバーしただけアニメーションが溜まって繰り返されてるみたい
だから「子供です」だけをホバーすれば1回だけアニメーションが行われる

【ちょいメモ】
.animate()でbackground-color使おうと思ったらjQuery.Color使ってないの使えないみたいね
略記の「font, background, border」とかはサポート外って知らんかった…

バブリングを止める方法

イベントの伝播を止めるstopPropagation()を使う

$('.child').mouseover(function(e) {
	e.stopPropagation();
}).mouseout(function(e) {
	e.stopPropagation();
});

これを足せば.childへのイベントの電波を止められるので複数回アニメーションが実行されることは無くなる
けど、ホバーアクションのイベントの伝播とめてるのでホバーしても反応しなくなる

似たやつでpreventDefault()ってのがあるけどこれは「画面遷移を止める」ものみたい

あ、mouseover()mouseenter()に変えるだけでもバブリング止められるね
mouseenter()はイベントバブリングを無視し、指定した要素だけでイベントを実行するみたい

参考

DOMイベントのキャプチャ/バブリングを整理する 〜 JSおくのほそ道 #017

親と子のclickイベントが併発しないようにする

.hover()はバブリングしないみたいなのでmouseover()とmouseover()を使わず.hover()を使えば解決する
.hover()を前回調べたのでせっかくだからって思い試してみた

Leave a Comment

入力エリアすべてが必須項目です。メールアドレスが公開されることはありません。

内容をご確認の上、送信してください。