Jquery mouseenter () ve fareyle üzerine gelme ()


172

Yani son zamanlarda cevaplanan bir soru okuduktan sonra gerçekten mouseenter()ve arasındaki farkı anlamak eğer belirsiz değilim mouseover(). Posta devletleri

MouseOver ():

Bir öğeye girdikten sonra ve öğenin içinde herhangi bir fare hareketi olduğunda ateşlenir.

MouseEnter ():

Bir eleman girdikten sonra ateşlenir.

Her ikisini de kullanan bir keman buldum ve oldukça benzer görünüyorlar. Birisi bana ikisi arasındaki farkı açıklayabilir mi?

Ayrıca JQuery tanımlarını okumaya çalıştım, her ikisi de aynı şeyi söylüyor.

Fare işaretçisi öğeye girdiğinde fareyle üzerine gelme olayı bir öğeye gönderilir

Fare işaretçisi öğeye girdiğinde mouseenter olayı bir öğeye gönderilir.

Birisi lütfen bir örnekle açıklığa kavuşturabilir mi?


1
Belgelerdeki demo oldukça iyi imo gösteriyor.
Felix Kling

2
Mouseenter ve mouseleave'in yalnızca IE'deki tescilli etkinlikler olduğunu ve jQuery tarafından diğer tarayıcılarda taklit edildiğini belirtmek gerekir (diğer tarayıcılarda hala uygulanmamış olsalar da şimdi spesifikasyonda görünüyorlar. Quirksmode.org/dom/events/mouseover.html )
Russ Cam

Yanıtlar:


274

Hedef öğeniz alt öğeler içerdiğinde davranışı görürsünüz:

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

Fareniz her alt öğeye girdiğinde veya ayrıldığında mouseovertetiklenir ancak tetiklenmez 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 - Hayır. mouseleaveEtkinliği de izleyen bu iki demo ile oynayın : jsfiddle.net/ZCWvJ/232 jsfiddle.net/ZCWvJ/233 Enter + ayrılmakla aynı yerde ise, toplam tutarı giriş ve çıkış sayıları.
gilly3

1
var n = + el.text();bunun yerine yazmak için özel bir neden var var n = el.text();mı? Sadece meraktan istiyorum.
Fredrick Gauss

3
@FredrickGauss - Bir sayıdan +döndürülen dizeyi zorlamak için operatörü kullanıyorum el.text(). Ben mi ihtiyacım için? Hayır. Bu durumda, kullanan bir sonraki ifade nde bunu bir sayıya zorlar. Peki, neden kullandım? Emin değilim ... bu 2 yıl önceydi. Bu iyi bir alışkanlık. Niyetimi açık yapıyor. Muhtemelen başlangıçta n + 1kaydetmeden önce vardı , ama kodumu 2 karakter küçültmeye ve kullanmaya karar verdim ++n. n + 1olur değil zorlamak nbir sayıya, ancak bunun yerine zorlamak olurdu 1mesela çıkışında, sonuçlanan bir dizeye 0111111.
gilly3

2
@ gilly3 - aklınızdaki seyahatinizin ayrıntılı açıklaması için teşekkürler.
Fredrick Gauss

1
@ gilly3 İyi bir özet, ancak küçük bir gelişme: "veya bir alt öğe" olması gerekir "veya alt öğe, çocuk ve ebeveyn arasında bir boşluk olduğu göz önüne alındığında bırakılır. alt öğeden her ayrıldığınızda fareyle üzerine gelme etkinliği alırsınız, ancak dolgu / kenar boşluğu olmadan deneyin ve bu etkinliği alamazsınız
İsrail

30

Bu bulduğum en iyi örneklerden biri:

  • MouseEnter
  • mouseover
  • mouseout
  • mouseLeave

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


Örnek oldukça havalı, ancak cevabınızı biraz daha yükseltmeniz için biraz daha yapılandırmanız gerekiyor. Bir soruya cevap vermeye çalıştığınızı unutmayın ... eğer sadece bağlantınız varsa belki bir yorum daha uygun olacaktır. İtibar nedeniyle henüz yorum yapamıyorsanız, biraz kazanın ve daha sonra yapın.
scristalli

Aslında, bu cevabı gerçekten seviyorum. Asker fare ve fare faresi tanımlarını vermişti. Bir örnek istiyorlardı ve bu örnek, buradaki diğer örneklerden çok daha iyi nasıl çalıştıklarını gösteriyor.
patorjk

gilly3'ün cevabı bir kusura sahip (yorumuma bakın). İyi yapılandırılmamış olsa da, bu cevap daha iyi bir kaynağa işaret ediyor.
İsrail

14

Ancak aynı şekilde çalışmasına rağmen, mouseenterolay yalnızca fare işaretçisi seçilen öğeye girdiğinde tetiklenir . mouseoverOlay tetiklenir bir fare işaretçisi de herhangi bir çocuk elemanlarını girerse .



3

MouseEnter olay farklıdır gelen Mouseover o değerlendirme şeklinde olay baloncuklanmasını . MouseEnter olay, sadece tetikler zaman onun işleyicisi fare elemanı girer o bağlandığı değil soyundan . Bakınız: https://api.jquery.com/mouseenter/

MouseLeave olay farklıdır gelen Fare terk işlediği şekilde olay baloncuklanmasını . MouseLeave olay, sadece tetikler zaman onun işleyicisi fare elemanı bırakır o bağlandığı değil soyundan . Bakınız: https://api.jquery.com/mouseleave/


2

Bu örnek arasındaki farkı gösterir mousemove , MouseEnter ve mouseover olayları:

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 : fare işaretçisi div öğesinin her üzerine getirildiğinde oluşur.
  • onmouseenter : yalnızca fare işaretçisi div öğesine girdiğinde oluşur.
  • onmouseover : fare işaretçisi div öğesine ve alt öğelerine (p ve span) girdiğinde oluşur.

nasılsa jsfiddle funcitons undefined diyerek kırıldı - Ben sadece çatal ve tüm js <script> jsfiddle.net/orc8empd
godblessstrawberry

0

Eski bir soru, ancak içgörü imo ile hala güncel bir cevap yok.

Bu gün, tüm tarayıcılar mouseover/mouseoutve destekler mouseenter/mouseleave. Bununla birlikte, jQuery işleyicinizi kaydettirmez mouseenter/mouseleave, ancak mouseover/mouseoutaşağıdaki kodun gösterdiği gibi sessizce bir sarmalayıcıya koyar vemouseenter/mouseleave .

Olayların kesin davranışı özellikle “delege işleyicileri” ile ilgilidir. Ne yazık ki, jQuery, delege işleyicilerinin ne olduğu ve etkinlikler için ne almaları gerektiğine dair kendi farklı yorumlarına sahiptir. Bu gerçek başka bir cevapta gösteriliyor daha basit tıklama etkinliği için .

Peki, olaylar ve işleyiciler için Javascript ifadesini kullanan, ancak her ikisini de farklı kılan ve belgelerinde bile bahsetmeyen jQuery ile ilgili bir soruyu düzgün bir şekilde nasıl cevaplayabilirim?

İlk olarak “gerçek” Javascript'teki farklılıklar:

  • her ikisi de
    • tarayıcı konumunu örneklediğinden daha hızlı hareket ettirildiğinde fare dış / dış elemanlardan iç / en içteki elemanlara “atlayabilir”
    • herhangi biri enter/overbuna karşılık gelir leave/out(muhtemelen geç / gergin)
    • olaylar işaretçinin altındaki görünür öğeye gider (görünmez → hedef olamaz)
  • mouseenter/mouseleave
    • kayıtlı olduğu öğeye teslim edilir (hedef)
    • eleman veya herhangi bir torun (örn. atlayarak) her girildiğinde / solda
    • kabarcık yapamaz, çünkü kavramsal olarak torunlar söz konusu öğenin bir parçası olarak kabul edilir, yani başka bir olayın gelebileceği hiçbir çocuk yoktur (ebeveyne “girilen / sola” anlamı ile ?!)
    • çocuklar da doğru girilen / ayrılan, ancak ebeveyn girme / bırakma döngüsüyle ilgisi olmayan benzer işleyicilere sahip olabilirler
  • mouseover/mouseout
    • hedef, işaretçinin altındaki gerçek öğedir
      • bir hedef iki şey olamaz: yani ebeveyn ve çocuk aynı anda değil
    • etkinlik "yuvalayamaz"
      • bir çocuğun “aşılabilmesi” için ebeveynin “dışarı çıkması” gerekir
    • target / relatedTarget etkinliğin nerede gerçekleştiğini gösterdiğinden, balon patlayabilir

Bazı testlerden sonra, jQuery “seçici kayıtlı delege işleyicileri” kullanmadığınız sürece, öykünmenin gereksiz ancak makul olduğunu gösterir: Alamayacak mouseover/mouseoutolayları filtreler mouseenter/mouseleave. Yine de hedef dağınık. Gerçek mouseenter/mouseleave, işleyici öğeyi hedef olarak verir, öykünme o öğenin çocuklarını, yani mouseover/mouseouttaşınan her şeyi gösterebilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.