คำถามเก่า แต่ก็ยังไม่มีคำตอบที่ทันสมัยพร้อมข้อมูลเชิงลึก
วันนี้เบราว์เซอร์สนับสนุนและmouseover/mouseout
mouseenter/mouseleave
อย่างไรก็ตาม jQuery ไม่ได้ลงทะเบียนจัดการของคุณไปmouseenter/mouseleave
แต่ทำให้เงียบพวกเขาในห่อรอบเป็นแสดงให้เห็นว่ารหัสต่อไปและทำให้การตีความแตกต่างกันเล็กน้อยของตัวเองของmouseover/mouseout
mouseenter/mouseleave
พฤติกรรมที่แน่นอนของกิจกรรมมีความเกี่ยวข้องโดยเฉพาะอย่างยิ่งใน "ผู้จัดการมอบหมาย" น่าเสียดายที่ jQuery มีการตีความที่แตกต่างกันไปของตัวจัดการผู้รับมอบสิทธิ์และสิ่งที่พวกเขาควรได้รับสำหรับเหตุการณ์ ความจริงนั้นปรากฏในคำตอบอื่นสำหรับเหตุการณ์การคลิกที่ง่ายขึ้น
ดังนั้นวิธีการตอบคำถามอย่างถูกต้องเกี่ยวกับ jQuery ซึ่งใช้ Javascript ถ้อยคำสำหรับเหตุการณ์และเครื่องมือจัดการ แต่ทำให้ทั้งสองแตกต่างกันและไม่ได้พูดถึงสิ่งนั้นในเอกสารประกอบ
ครั้งแรกที่ความแตกต่างใน Javascript "ของจริง":
- ทั้งสอง
- เมาส์สามารถ“ กระโดด” จากองค์ประกอบภายนอก / ภายนอกไปยังองค์ประกอบภายใน / ภายในสุดเมื่อเคลื่อนที่เร็วกว่าเบราว์เซอร์ตัวอย่างตำแหน่ง
- ใด ๆ ที่
enter/over
ได้รับที่สอดคล้องกันleave/out
(อาจจะช้า / น่ากลัว)
- กิจกรรมไปที่องค์ประกอบที่มองเห็นได้ด้านล่างตัวชี้ (มองไม่เห็น→ไม่สามารถกำหนดเป้าหมายได้)
mouseenter/mouseleave
- ถูกส่งไปยังองค์ประกอบที่ลงทะเบียน (เป้าหมาย)
- เมื่อใดก็ตามที่องค์ประกอบหรือลูกหลานใด ๆ (เช่นโดยการกระโดด) ถูกป้อน / ซ้าย
- มันไม่สามารถทำให้เกิดฟองได้เนื่องจากในความคิดลูกหลานได้รับการพิจารณาว่าเป็นส่วนหนึ่งขององค์ประกอบที่กล่าวถึงนั่นคือไม่มีเด็ก ๆ ที่เหตุการณ์อื่นอาจมาจาก (โดยมีความหมายว่า "ป้อน / ซ้าย" ผู้ปกครอง?!)
- เด็กอาจมีตัวจัดการที่คล้ายกันที่ลงทะเบียนซึ่งเข้า / ออกอย่างถูกต้อง แต่ไม่เกี่ยวข้องกับวงจรการเข้า / ออกจากผู้ปกครอง
mouseover/mouseout
- เป้าหมายคือองค์ประกอบจริงใต้ตัวชี้
- เป้าหมายไม่สามารถเป็นสองสิ่ง: กล่าวคือไม่ใช่พ่อแม่และลูกในเวลาเดียวกัน
- เหตุการณ์ไม่สามารถ“ ทำรัง”
- ก่อนที่เด็กจะ“ overed” ผู้ปกครองจะต้อง“ ออก”
- สามารถบับเบิลเนื่องจากเป้าหมาย / relatedTarget ระบุว่าเหตุการณ์เกิดขึ้นที่ใด
หลังจากการทดสอบบางอย่างมันแสดงให้เห็นว่าตราบใดที่คุณไม่ได้ใช้ jQuery“ ตัวจัดการผู้รับมอบสิทธิ์ด้วยการลงทะเบียนตัวเลือก” การจำลองนั้นไม่จำเป็น แต่สมเหตุสมผล: มันกรองmouseover/mouseout
เหตุการณ์ที่ a 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>