mouseover/mouseoutとmouseenter/mouseleaveの挙動の違いを比べてみます。
サンプルコード1
要素を入れ子にして、親要素(.parent)にイベントを追加してみます。
HTML
<p>mouseoverとmouseout</p> <div id="parentA" class="parent"> <div id="childrenA" class="children"></div> </div> <p>mouseenterとmouseleave</p> <div id="parentB" class="parent"> <div id="childrenB" class="children"></div> </div> <p>hover</p> <div id="parentC" class="parent"> <div id="childrenC" class="children"></div> </div>
JavaScript
$(function() {
$('#parentA').mouseover(function(e) {
console.groupCollapsed('#parentAにmouseover');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
}).mouseout(function(e) {
console.groupCollapsed('#parentAからmouseout');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
});
$('#parentB').mouseenter(function(e) {
console.groupCollapsed('#parentBにmouseenter');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
}).mouseleave(function(e) {
console.groupCollapsed('#parentBからmouseleave');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
});
$('#parentC').hover(function(e) {
console.groupCollapsed('#parentCにhover(in)');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
}, function(e) {
console.groupCollapsed('#parentCからhover(out)');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
});
});
親要素のみにイベントを追加した場合のデモページ
「.parentにオンマウス→.childrenにオンマウス→.childrenからマウスアウト→.parentからマウスアウト」
の順番でカーソルを動かしてみて、各動きでconsoleがどう表示されるか試してみました。
サンプルコード1の結果
consoleはそれぞれ以下のように表示されました。
mouseoverとmouseout
// .parentにオンマウスしたとき
#parentAにmouseover
e.target.id : parentA
$(this).attr('id') : parentA
// .childrenにオンマウスしたとき
#parentAからmouseout
e.target.id : parentA
$(this).attr('id') : parentA
#parentAにmouseover
e.target.id : childrenA
$(this).attr('id') : parentA
// .childrenからマウスアウトしたとき
#parentAからmouseout
e.target.id : childrenA
$(this).attr('id') : parentA
#parentAにmouseover
e.target.id : parentA
$(this).attr('id') : parentA
// .parentからマウスアウトしたとき
#parentAからmouseout
e.target.id : parentA
$(this).attr('id') : parentA
.childrenにオンマウスしたときに、.parentにマウスアウトが発生した後、再度.parentにオンマウスイベントが発生しています。
ただし、この時のオンマウスイベントのe.target.idはchildrenAになっています。
.childrenからマウスアウトしたときも同様で、.parentにマウスアウトが発生(e.target.idはchildrenA)した後、再度.parentにオンマウスイベントが発生しています。
mouseenterとmouseleave
// .parentにオンマウスしたとき
#parentBにmouseenter
e.target.id : parentB
$(this).attr('id') : parentB
// .childrenにオンマウスしたとき (consoleの表示なし)
// .childrenからマウスアウトしたとき (consoleの表示なし)
// .parentからマウスアウトしたとき
#parentBからmouseleave
e.target.id : parentB
$(this).attr('id') : parentB
mouseoverとmouseoutのときとは違い、.childrenにオンマウス、マウスアウトしたときは特にイベントは発生していません。
hover
// .parentにオンマウスしたとき
#parentCにhover(in)
e.target.id : parentC
$(this).attr('id') : parentC
// .childrenにオンマウスしたとき (consoleの表示なし)
// .childrenからマウスアウトしたとき (consoleの表示なし)
// .parentからマウスアウトしたとき
#parentCからhover(out)
e.target.id : parentC
$(this).attr('id') : parentC
mouseenterとmouseleaveと挙動は同じになります。
サンプルコード2
先ほどのデモに、子要素にも同じイベントを追加してみます。
JavaScript
$(function() {
$('#parentA').mouseover(function(e) {
console.groupCollapsed('#parentAにmouseover');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
}).mouseout(function(e) {
console.groupCollapsed('#parentAからmouseout');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
});
$('#childrenA').mouseover(function(e) {
console.groupCollapsed('#childrenAにmouseover');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
}).mouseout(function(e) {
console.groupCollapsed('#childrenAからmouseout');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
});
$('#parentB').mouseenter(function(e) {
console.groupCollapsed('#parentBにmouseenter');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
}).mouseleave(function(e) {
console.groupCollapsed('#parentBからmouseleave');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
});
$('#childrenB').mouseenter(function(e) {
console.groupCollapsed('#childrenBにmouseenter');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
}).mouseleave(function(e) {
console.groupCollapsed('#childrenBからmouseleave');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
});
$('#parentC').hover(function(e) {
console.groupCollapsed('#parentCにhover(in)');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
}, function(e) {
console.groupCollapsed('#parentCからhover(out)');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
});
$('#childrenC').hover(function(e) {
console.groupCollapsed('#childrenCにhover(in)');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
}, function(e) {
console.groupCollapsed('#childrenCからhover(out)');
console.log('e.target.id : ' + e.target.id);
console.log("$(this).attr('id') : " + $(this).attr('id'));
console.groupEnd();
});
});
親要素と子要素にイベントを追加した場合のデモページ
先ほどと同じ順番でカーソルを動かしてみて、consoleがどう表示されるか試してみます。
サンプルコード2の結果
結果は以下のようになりました。
mouseoverとmouseout
// .parentにオンマウスしたとき
#parentAにmouseover
e.target.id : parentA
$(this).attr('id') : parentA
// .childrenにオンマウスしたとき
#parentAからmouseout
e.target.id : parentA
$(this).attr('id') : parentA
#childrenAにmouseover
e.target.id : childrenA
$(this).attr('id') : childrenA
#parentAにmouseover
e.target.id : childrenA
$(this).attr('id') : parentA
// .childrenからマウスアウトしたとき
#childrenAからmouseout
e.target.id : childrenA
$(this).attr('id') : childrenA
#parentAからmouseout
e.target.id : childrenA
$(this).attr('id') : parentA
#parentAにmouseover
e.target.id : parentA
$(this).attr('id') : parentA
// .parentからマウスアウトしたとき
#parentAからmouseout
e.target.id : parentA
$(this).attr('id') : parentA
mouseenterとmouseleave
// .parentにオンマウスしたとき
#parentBにmouseenter
e.target.id : parentB
$(this).attr('id') : parentB
// .childrenにオンマウスしたとき
#childrenBにmouseenter
e.target.id : childrenB
$(this).attr('id') : childrenB
// .childrenからマウスアウトしたとき
#childrenBからmouseleave
e.target.id : childrenB
$(this).attr('id') : childrenB
// .parentからマウスアウトしたとき
#parentBからmouseleave
e.target.id : parentB
$(this).attr('id') : parentB
hover
// .parentにオンマウスしたとき
#parentCにhover(in)
e.target.id : parentC
$(this).attr('id') : parentC
// .childrenにオンマウスしたとき
#childrenCにhover(in)
e.target.id : childrenC
$(this).attr('id') : childrenC
// .childrenからマウスアウトしたとき
#childrenCからhover(out)
e.target.id : childrenC
$(this).attr('id') : childrenC
// .parentからマウスアウトしたとき
#parentCからhover(out)
e.target.id : parentC
$(this).attr('id') : parentC
サンプルコード3
サンプルコード1で、親要素と子要素のサイズが同じ場合を試してみます。
HTML、JavaScriptはサンプルコード1と同じです。
サンプルコード3の結果
結果は以下のようになりました。
mouseoverとmouseout
// .parentにオンマウスしたとき
#parentAにmouseover
e.target.id : childrenA
$(this).attr('id') : parentA
// .parentからマウスアウトしたとき
#parentAからmouseout
e.target.id : childrenA
$(this).attr('id') : parentA
mouseenterとmouseleave
// .parentにオンマウスしたとき
#parentBにmouseenter
e.target.id : childrenB
$(this).attr('id') : parentB
// .parentからマウスアウトしたとき
#parentBからmouseleave
e.target.id : childrenB
$(this).attr('id') : parentB
hover
// .parentにオンマウスしたとき
#parentCにhover(in)
e.target.id : childrenC
$(this).attr('id') : parentC
// .parentからマウスアウトしたとき
#parentCからhover(out)
e.target.id : childrenC
$(this).attr('id') : parentC
サンプルコード4
サンプルコード2で、親要素と子要素のサイズが同じ場合を試してみます。
サンプルコード4の結果
結果は以下のようになりました。
mouseoverとmouseout
// .parentにオンマウスしたとき
#childrenAにmouseover
e.target.id : childrenA
$(this).attr('id') : childrenA
#parentAにmouseover
e.target.id : childrenA
$(this).attr('id') : parentA
// .parentからマウスアウトしたとき
#childrenAからmouseout
e.target.id : childrenA
$(this).attr('id') : childrenA
#parentAからmouseout
e.target.id : childrenA
$(this).attr('id') : parentA
mouseenterとmouseleave
// .parentにオンマウスしたとき
#childrenBにmouseenter
e.target.id : childrenB
$(this).attr('id') : childrenB
#parentBにmouseenter
e.target.id : childrenB
$(this).attr('id') : parentB
// .parentからマウスアウトしたとき
#childrenBからmouseleave
e.target.id : childrenB
$(this).attr('id') : childrenB
#parentBからmouseleave
e.target.id : childrenB
$(this).attr('id') : parentB
hover
// .parentにオンマウスしたとき
#childrenCにhover(in)
e.target.id : childrenC
$(this).attr('id') : childrenC
#parentCにhover(in)
e.target.id : childrenC
$(this).attr('id') : parentC
// .parentからマウスアウトしたとき
#childrenCからhover(out)
e.target.id : childrenC
$(this).attr('id') : childrenC
#parentCからhover(out)
e.target.id : childrenC
$(this).attr('id') : parentC
【参考サイト】
コメントが承認されるまで時間がかかります。