jquery mouseenter()とmouseover()


172

したがって、最近回答された質問を読んだ後、mouseenter()との違いを本当に理解しているかどうかはわかりませんmouseover()。投稿の状態

マウスオーバー():

要素に入ると、要素内でマウスの動きが発生するたびに発生します。

MouseEnter():

要素に入ると発砲します。

私は両方を使用するフィドルを思いつきました、そしてそれらはかなり似ているようです。誰かが私に2つの違いを説明できますか?

私はまた、JQueryの定義を読んでみましたが、どちらも同じことを言っています。

マウスポインターが要素に入ると、mouseoverイベントが要素に送信されます。

マウスポインターが要素に入ると、mouseenterイベントが要素に送信されます。

誰かが例で明確にしてくれますか?


1
ドキュメントのデモは、imoを非常によく示しています。
Felix Kling 2011

2
mouseenterとmouseleaveはIEのみの独自のイベントであり、jQueryによって他のブラウザーでエミュレートされたことに注意する必要があります(他のブラウザーではまだ実装されていませんが、仕様に含まれているようです。quirksmode.org/ dom / events / mouseover.htmlを参照してください)
Russ Cam

回答:


274

ターゲット要素に子要素が含まれている場合の動作を確認します。

http://jsfiddle.net/ZCWvJ/7/

マウスが子要素に出入りするたびにmouseoverトリガーされますが、トリガーされませんmouseenter

$('#my_div').bind("mouseover mouseenter", function(e) {
  var el = $("#" + e.type);
  var n = +el.text();
  el.text(++n);
});
#my_div {
  padding: 0 20px 20px 0;
  background-color: #eee;
  margin-bottom: 10px;
  width: 90px;
  overflow: hidden;
}

#my_div>div {
  float: left;
  margin: 20px 0 0 20px;
  height: 25px;
  width: 25px;
  background-color: #aaa;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>

<div>MouseEnter: <span id="mouseenter">0</span></div>
<div>MouseOver: <span id="mouseover">0</span></div>

<div id="my_div">
  <div></div>
  <div></div>
  <div></div>
  <div></div>
</div>


2
@psychobrm -この二つのデモで第プレイも追跡mouseleaveイベント: jsfiddle.net/ZCWvJ/232 jsfiddle.net/ZCWvJ/233 もし同じように+休暇を入力する場所の上には、その後、以上のカウントは、の合計になります入場と退場のカウント。
gilly3 2013

1
var n = + el.text();代わりに書く特別な理由はありvar n = el.text();ますか?好奇心だけを求めています。
Fredrick Gauss

3
@FredrickGauss- +演算子を使用して、返された文字列をel.text()数値に強制変換しています。私はする必要がありましたか?いいえ。この場合、を使用nする次のステートメントも、数値に強制変換します。では、なぜそれを使用したのですか?わかりません...これは2年前のことです。それは良い習慣です。それは私の意図を明確にします。おそらく私n + 1は保存する前に最初に持っていたのですが、コードを2文字縮小してを使用することにしました++nn + 1ではない強制n番号に、代わりに強制だろう1例えば、の出力に結果の文字列に0111111
gilly3 2013

2
@ gilly3-心の中であなたの旅行の詳細な説明をありがとう。
Fredrick Gauss

1
@ gilly3良い要約ですが、マイナーな改善です:「または子要素を残す」は、「または子要素を離れる必要があります。子と親の間にギャップがあることを前提とします。フィドルにマージン/パディングがあり、それが本当です子要素を離れると必ずマウスオーバーイベントが発生しますが、パディング/マージンなしで試してみると、このイベントは発生しません
イスラエル

30

これは私が見つけた最良の例の1つです。

  • マウス入力
  • マウスオーバー
  • マウスアウト
  • ねずみ

http://bl.ocks.org/mbostock/5247027


例はかなりクールですが、賛成票を獲得するには、回答をもう少し構成する必要があります。質問に答えようとしていることを忘れないでください...リンクしかない場合は、コメントの方が適切でしょう。評判のためにまだコメントできない場合は、コメントを得て、後でコメントしてください。
scristalli 2014年

実際、私はこの答えが本当に好きです。質問者はすでに、mouseoverとmouseenterの定義を提供しています。彼らは例を求めていましたが、この例は、他の例よりもはるかにうまく機能することを示しています。
patorjk 2015

gilly3の回答には欠陥があります(私のコメントを参照)。うまく構成されていなくても、この回答はより優れたリソースを示しています。
イスラエル

14

ただし、同じように動作しますが、mouseenterイベントは、マウスポインターが選択した要素に入ったときにのみトリガーされます。このmouseoverイベントは、マウスポインターが子要素にも入るとトリガーされます


3

jqueryドキュメントページの下部にあるサンプルコードとデモをご覧ください。

http://api.jquery.com/mouseenter/

... mouseoverは、ポインターが子要素に移動したときにも発生しますが、mouseenterは、ポインターがバインドされた要素に移動したときにだけ発生します。


3

MouseEnterのイベント異なっからマウスオーバーそれが処理する方法でイベントバブリングをMouseEnterのイベントは、唯一のトリガー時にそのハンドラをマウスが要素に入り、それがバインドされている、いない子孫を。参照:https : //api.jquery.com/mouseenter/

mouseleaveイベント異なっからマウスアウトそれが処理する方法でイベントバブリングをmouseleaveイベントは、唯一のトリガー時にそのハンドラをマウスが要素の葉、それがバインドされている、いない子孫を。参照:https : //api.jquery.com/mouseleave/


2

この例は、mousemovemouseenter、およびmouseoverイベントの違いを示しています。

https://jsfiddle.net/z8g613yd/

HTML:

<div onmousemove="myMoveFunction()">
    <p>onmousemove: <br> <span id="demo">Mouse over me!</span></p>
</div>

<div onmouseenter="myEnterFunction()">
    <p>onmouseenter: <br> <span id="demo2">Mouse over me!</span></p>
</div>

<div onmouseover="myOverFunction()">
    <p>onmouseover: <br> <span id="demo3">Mouse over me!</span></p>
</div>

CSS:

div {
    width: 200px;
    height: 100px;
    border: 1px solid black;
    margin: 10px;
    float: left;
    padding: 30px;
    text-align: center;
    background-color: lightgray;
}

p {
    background-color: white;
    height: 50px;
}

p span {
    background-color: #86fcd4;
    padding: 0 20px;
}

JS:

var x = 0;
var y = 0;
var z = 0;

function myMoveFunction() {
    document.getElementById("demo").innerHTML = z += 1;
}

function myEnterFunction() {
    document.getElementById("demo2").innerHTML = x += 1;
}

function myOverFunction() {
    document.getElementById("demo3").innerHTML = y += 1;
}
  • onmousemove :マウスポインターがdiv要素の上に移動するたびに発生します。
  • onmouseenter :マウスポインターがdiv要素に入ると発生します。
  • onmouseover :マウスポインターがdiv要素とその子要素(pおよびspan)に入ると発生します。

どういうわけか、関数が定義されていないとjsfiddleが壊れています-私はforkして、すべてのjsを<script> jsfiddle.net/orc8empdに
godblessstrawberry

0

古い質問ですが、インサイトimoを使用した最新の回答はありません。

最近では、すべてのブラウザがmouseover/mouseoutおよびをサポートしていmouseenter/mouseleaveます。それでも、jQueryはハンドラーをmouseenter/mouseleaveに登録しませんがmouseover/mouseout、次のコードが示すように、ラッパーに静かに配置し、独自のわずかに異なる解釈を行いmouseenter/mouseleaveます。

イベントの正確な動作は、「デリゲートハンドラー」に特に関連しています。残念ながら、jQueryはデリゲートハンドラーとは何か、イベントで受け取る必要があるデリゲートハンドラーの解釈も異なります。その事実は、より単純なクリックイベントの別の回答に示されています。

では、jQueryに関する質問に適切に答えるにはどうすればよいでしょうか。jQueryは、イベントとハンドラーにJavaScriptの文言を使用しますが、両方に違いがあり、そのドキュメントにそのことさえ言及していません。

まず、「実際の」JavaScriptの違い:

  • 両方とも
    • ブラウザがその位置をサンプリングするよりも速く動かすと、マウスは外側/外側の要素から内側/最も内側の要素に「ジャンプ」できます
    • いずれかenter/overが対応するleave/out(おそらく遅れる/ジャンプする)
    • イベントは、ポインターの下の表示要素に移動します(非表示→ターゲットにすることはできません)
  • mouseenter/mouseleave
    • 登録れた要素に配信されます(ターゲット)
    • 要素または子孫(ジャンプなど)が開始/左に移動したとき
    • 概念的には子孫が問題の要素の一部と見なされるため、バブルすることはできません。つまり、別のイベントが発生する可能性のある子はありません(親が「入る/左」の意味で!?)
    • 子には、同様にハンドラーが登録されている場合があります。これらのハンドラーは、正しく開始/終了しますが、親の開始/終了サイクルとは関係ありません。
  • mouseover/mouseout
    • ターゲットはポインタの下の実際の要素です
      • ターゲットを2つにすることはできません。つまり、同時に親と子にすることはできません
    • イベントは「ネスト」できません
      • 子供が「オーバー」になる前に、親は「外に出る」必要があります
    • target / relatedTargetはイベントが発生した場所を示すため、バブルする可能性があります

それは除外さ:いくつかのテストの後、それは限り、あなたはjQueryの「セレクタ登録とデリゲートハンドラ」を使用していないようとして、エミュレーションが不要ますが合理的であることを示しているmouseover/mouseoutというイベントをmouseenter/mouseleave取得しません。ただし、ターゲットはめちゃくちゃです。本当のmouseenter/mouseleaveエミュレーションがどんなすなわち、その要素の子を示している可能性があり、ターゲットとしてハンドラ要素を与えるだろうmouseover/mouseout運ば。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.