Eski bir soru, ancak içgörü imo ile hala güncel bir cevap yok.
Bu gün, tüm tarayıcılar mouseover/mouseout
ve destekler mouseenter/mouseleave
. Bununla birlikte, jQuery işleyicinizi kaydettirmez mouseenter/mouseleave
, ancak mouseover/mouseout
aş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/over
buna 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/mouseout
olayları 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/mouseout
taşınan her şeyi gösterebilir .
const list = document.getElementById('log');
const outer = document.getElementById('outer');
const $outer = $(outer);
function log(tag, event) {
const li = list.insertBefore(document.createElement('li'), list.firstChild);
// only jQuery handlers have originalEvent
const e = event.originalEvent || event;
li.append(`${tag} got ${e.type} on ${e.target.id}`);
}
outer.addEventListener('mouseenter', log.bind(null, 'JSmouseenter'));
$outer.on('mouseenter', log.bind(null, '$mouseenter'));
div {
margin: 20px;
border: solid black 2px;
}
#inner {
min-height: 80px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<body>
<div id=outer>
<ul id=log>
</ul>
</div>
</body>