Коротка відповідь
middlemouseleave — це подія, що спрацьовує лише при виході курсору з елемента і всіх його дочірніх вузлів, тоді як mouseout спрацьовує при виході з елемента або будь‑якого дочірнього вузла. У mouseout можна обробляти переходи між вкладеними елементами, а у mouseleave — ні. Приклад: <div onmouseleave="handleLeave()" onmouseout="handleOut()">…</div>
Повне пояснення
Що це і навіщо
mouseleaveтаmouseout— події миші, що реагують на переміщення курсору.mouseleaveвикористовується, коли потрібна реакція лише при виході з конкретного елемента, незалежно від дочірніх.mouseoutпотрібна, коли треба знати про переходи між вкладеними елементами.
Ключові принципи/терміни
- Event bubbling – обидві події підвисають, але
mouseleaveне спрацьовує при переході між дочірніми. - Target – елемент, на якому спрацьовує подія; у
mouseoutце може бути дочірній.
Як це працює
- При переміщенні курсору з елемента на інший, браузер генерує
mouseoutі, якщо вихід не в дочірній елемент, такожmouseleave. - Якщо курсор переходить між дочірніми вузлами, генерується
mouseout, але неmouseleave.
Практика і реалізація
<div onmouseleave={handleLeave} onmouseout={handleOut}>Content</div>
Тестування
- У Jest можна симулювати
mouseoutі перевірити, що відповідний колбек викликаний.
Особливості в контексті frontend
- У React використовується
onMouseLeave/onMouseOut. Важливо розуміти різницю, щоб уникнути зайвих перерендерів.
Оптимізація та типові помилки
- Часто плутають
mouseleaveзmouseout, що призводить до зайвих обробників. - Переконайтеся, що не додаєте
mouseleaveдо елементів без дочірніх, якщо потрібна реакція лише на вихід з них.
Диагностика
- Якщо
mouseleaveне спрацьовує, перевірте, чи немає дочірніх елементів, які захоплюють подію. - Для
mouseoutвикористовуйтеevent.relatedTarget, щоб визначити, куди переміщено курсор.