पुराना सवाल है, लेकिन अभी भी अंतर्दृष्टि imo के साथ कोई अच्छा अप-टू-डेट जवाब नहीं है।
इन दिनों, सभी ब्राउज़र समर्थन करते हैं mouseover/mouseout
और mouseenter/mouseleave
। फिर भी, jQuery आपके हैंडलर को पंजीकृत नहीं करता है mouseenter/mouseleave
, लेकिन चुपचाप उन्हें एक रैपर पर रखता है, mouseover/mouseout
जैसा कि निम्नलिखित कोड दिखाता है और अपनी थोड़ी अलग व्याख्या करता हैmouseenter/mouseleave
।
घटनाओं का सटीक व्यवहार "प्रतिनिधि हैंडलर" पर विशेष रूप से प्रासंगिक है। दुर्भाग्य से, jQuery की अपनी अलग व्याख्या भी है कि प्रतिनिधि हैंडलर क्या हैं और उन्हें घटनाओं के लिए क्या प्राप्त करना चाहिए। यह तथ्य सरल क्लिक घटना के लिए एक अन्य उत्तर में दिखाया गया है ।
तो jQuery के बारे में एक प्रश्न का ठीक से उत्तर कैसे दें, जो घटनाओं और हैंडलर के लिए जावास्क्रिप्ट शब्दांकन का उपयोग करता है, लेकिन दोनों को अलग बनाता है और इसका प्रलेखन में उल्लेख भी नहीं करता है?
"वास्तविक" जावास्क्रिप्ट में पहले अंतर:
- दोनों
- जब माउस ब्राउज़र की स्थिति से तेज हो जाता है तो माउस बाहरी / बाहरी तत्वों से बाहरी / बाहरी तत्वों से "कूद" सकता है
- किसी भी
enter/over
एक इसी हो जाता है leave/out
(संभवतः देर से / उछल)
- ईवेंट पॉइंटर के नीचे दृश्य तत्व पर जाते हैं (अदृश्य → लक्ष्य नहीं हो सकता)
mouseenter/mouseleave
- उस तत्व तक पहुँचाया जाता है जहाँ पंजीकृत है (लक्ष्य)
- जब भी तत्व या किसी वंशज (जैसे कूद कर) को प्रवेश / छोड़ दिया जाता है
- यह बुलबुला नहीं हो सकता है, क्योंकि वैचारिक रूप से वंश को प्रश्न में तत्व का हिस्सा माना जाता है, अर्थात ऐसे बच्चे नहीं हैं जहां से एक और घटना आ सकती है (माता-पिता के "प्रवेश / छोड़ दिया" के अर्थ के साथ ?!)
- बच्चों के लिए समान हैंडलर पंजीकृत हो सकते हैं, जो सही ढंग से प्रवेश / छुट्टी देते हैं, लेकिन माता-पिता के प्रवेश / छुट्टी चक्र से असंबंधित हैं
mouseover/mouseout
- लक्ष्य सूचक के नीचे वास्तविक तत्व है
- एक लक्ष्य दो चीजें नहीं हो सकती हैं: यानी एक ही समय में माता-पिता और बच्चा नहीं
- घटना "घोंसला" नहीं कर सकती
- एक बच्चे के "ओवरडेड" होने से पहले, माता-पिता को "आउट" होने की आवश्यकता होती है
- बबल कर सकते हैं, क्योंकि लक्ष्य / संबंधितटार्ग इंगित करता है कि घटना कहां हुई है
कुछ परीक्षण के बाद, यह दिखाता है कि जब तक आप चयनकर्ता पंजीकरण के साथ jQuery के "प्रतिनिधि हैंडलर का उपयोग नहीं करते हैं", अनुकरण अनावश्यक है लेकिन उचित है: यह उन mouseover/mouseout
घटनाओं को फ़िल्टर करता है जो mouseenter/mouseleave
नहीं मिलेगा। लक्ष्य गड़बड़ है, हालांकि। असली mouseenter/mouseleave
हैंडलर तत्व को लक्ष्य के रूप में देगा, अनुकरण उस तत्व के बच्चों को इंगित कर सकता है, अर्थात जो कुछ भी किया mouseover/mouseout
जाता है।
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>