我觉得自己快要疯了。。。因此,根据我的理解和互联网上的普遍共识,mouseout
在光标上触发,留下一个元素或它的任何子元素,而mouseleave
只在光标上激发,留下事件所附的元素
<html>
<body>
<div id='test'>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Four</li>
</ul>
</div>
<script>
const div = document.getElementById('test');
div.addEventListener('mouseleave', (e) => console.log('out'), true);
</script>
</body>
</html>
当鼠标离开该div的任何后代时,mouseleave
事件肯定仍在启动。我觉得我一定做错了什么,但是。。。什么
尝试从addEventListener
中删除最后一个参数-它被称为useCapture
,默认情况下是false
。如果您传递true
,则事件将在捕获阶段激发,这将导致在每个子元素上激发mouseleave
。阅读有关useCapture
参数的更多信息-https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
mouseleave
事件不会冒泡,因为它在离开子元素时不会触发父事件。但当您通过useCapture
时,您会强制事件在捕获阶段启动。MDN上的事件阶段-https://developer.mozilla.org/ru/docs/Web/API/Event/eventPhase
const div = document.getElementById('test');
div.addEventListener('mouseleave', (e) => console.log('out')); // Remove `true`
<html>
<body>
<div id='test'>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
<li>Four</li>
</ul>
</div>
</body>
</html>