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」とかはサポート外って知らんかった…
.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
.hover()はバブリングしないみたいなのでmouseover()とmouseover()を使わず.hover()を使えば解決する
.hover()を前回調べたのでせっかくだからって思い試してみた