点击触发Mouseleave

Ada*_*kis 19 javascript dom google-chrome mouseevent

我有一个绝对定位的div,我试图跟踪鼠标何时移动它以及鼠标何时离开.不幸的是,单击框中的文本偶尔会触发mouseleave事件.

演示:js小提琴

我怎么能阻止这个?

JS

let tooltip = document.createElement('div');
tooltip.innerHTML = 'HELLO WORLD';
tooltip.setAttribute('class', 'tooltip');
tooltip.style.display = 'none';

tooltip.onclick = evt => {
    console.log('click')
    evt.stopPropagation();
}
tooltip.ondblclick = evt => {
    console.log('double click')
    evt.stopPropagation();
}

tooltip.onmouseenter = () => {
    console.log('tooltip mouse OVER');
}

tooltip.onmouseleave = () => {
    console.log('tooltip mouse OUT')
}

tooltip.style.left = '290px';
tooltip.style.top = '50px';
tooltip.style.display = 'block';
document.body.appendChild(tooltip);
Run Code Online (Sandbox Code Playgroud)

HTML

<div style="width: 300px; height: 300px; background-color: lightblue">

</div>
Run Code Online (Sandbox Code Playgroud)

CSS

.tooltip {
    position: absolute;
    /*display: none;*/
    left: 100;
    top: 100;
    min-width: 80px;
    height: auto;
    background: none repeat scroll 0 0 #ffffff;
    border: 1px solid #6F257F;
    padding: 14px;
    text-align: center;
}
Run Code Online (Sandbox Code Playgroud)

Dre*_*nai 12

我之前看过这里的答案和评论,但最近找到了一种检查mouseleave事件是否被错误触发的方法

我在mouseleave处理程序中添加了一个检查:

private handleMouseLeave(event: MouseEvent) {
    if(event.relatedTarget || event.toElement){
        // do whatever
    }
    // otherwise ignore
}
Run Code Online (Sandbox Code Playgroud)

根据我在Chrome v64上的测试,null只要快速点击导致mouseleave事件被触发,这两个值都将是.这relatedTarget是为了较旧的浏览器兼容性

注意:null如果鼠标离开target元素并进入浏览器(例如选项卡,菜单等)或离开浏览器窗口,这两个值也将是.对于我的目的,这不是一个问题,因为它是我正在使用的滑动菜单,并且离开浏览器窗口不应该在我的特定情况下关闭菜单.

注意:mouseleave我的菜单每次点击都会触发最新的Firefox版本(2018年2月)!将不得不调查它


tri*_*cot 10

这似乎是一个错误(我可以在Chrome中重现它,点击鼠标按下并且鼠标在彼此之后快速发生).

我建议通过检查事件被触发时鼠标是否仍然在元素上来解决此问题:

tooltip.onmouseleave = (e) => {
    if (tooltip === document.elementFromPoint(e.clientX, e.clientY)) {
        console.log('false positive');
        return;
    }
    console.log('tooltip mouse OUT')
}
Run Code Online (Sandbox Code Playgroud)

缺点是当浏览器窗口失去焦点时,这也被认为是误报.如果这对您来说是一个问题,请检查此答案.

  • 有没有关于这个bug的更多信息,似乎这是一个非常重要的问题,但几乎没有人遇到它(我现在是)?触发它是否需要非常具体的条件? (2认同)