javascript - 没有 jQuery 的可靠 "mouseenter"

标签 javascript dom-events mouseevent

我四处寻找,似乎找不到可靠的 mouseenter 事件。

我找到的最接近的是:mouseenter without JQuery

function contains(container, maybe) {
  return container.contains ? container.contains(maybe) : !!(container.compareDocumentPosition(maybe) & 16);
}

var _addEvent = window.addEventListener ? function (elem, type, method) {
  elem.addEventListener(type, method, false);
} : function (elem, type, method) {
  elem.attachEvent('on' + type, method);
};

var _removeEvent = window.removeEventListener ? function (elem, type, method) {
  elem.removeEventListener(type, method, false);
} : function (elem, type, method) {
  elem.detachEvent('on' + type, method);
};

function _mouseEnterLeave(elem, type, method) {
    var mouseEnter = type === 'mouseenter',
        ie = mouseEnter ? 'fromElement' : 'toElement',
        method2 = function (e) {
            e = e || window.event;
            var related = e.relatedTarget || e[ie];
            if ((elem === e.target || contains(elem, e.target)) &&
                !contains(elem, related)) {
                    method();
            }
        };
    type = mouseEnter ? 'mouseover' : 'mouseout';
    _addEvent(elem, type, method2);
    return method2;
}

唯一的问题是当我运行它时:

_mouseEnterLeave(ele, 'mouseenter', function(){
  console.log('test');
});

每次听众触发时,我都会立即执行 40-47 次(每次都不同)。

我也试过 Quirksmode:http://www.quirksmode.org/js/events_mouse.html#mouseenter

function doSomething(e) {
    if (!e) var e = window.event;
    var tg = (window.event) ? e.srcElement : e.target;
    if (tg.nodeName != 'DIV') return;
    var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
    while (reltg != tg && reltg.nodeName != 'BODY')
        reltg= reltg.parentNode
    if (reltg== tg) return;
    // Mouseout took place when mouse actually left layer
    // Handle event
}

但是这个非常不可靠,不仅如此,它假定父元素/元素是 DIV。这必须更加动态。这是一个库/脚本,所以我不能包含 jQuery。

简而言之,我有一个在鼠标移动之前隐藏的元素。一旦它移动,只要鼠标在移动,或者如果鼠标悬停在元素本身上,它就会出现。更少的代码会很棒,因为只有 WebKit 本身不支持 mouseenter 并且从第一个示例中获取大量代码只是为了支持 Chrome 的一个小 UI 东西感觉很浪费。

最佳答案

是否可以只废弃 mouseenter 而使用 mousemove 代替?这负责在鼠标移动时显示它。要使其在直接悬停在元素上时保持可见,只需改用 CSS。

#your_element {
    display: none;
}

#your_element:hover {
    display: block;
}

关于javascript - 没有 jQuery 的可靠 "mouseenter",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8554471/

相关文章:

javascript - 检查函数是否对数组中的任何项返回 true

用于事件处理的 JavaScript 库出现奇怪的 'undefined' 错误

c - 如何通过鼠标单击获取像素的 RGB 颜色值

c# - 事件不会对额外的鼠标按钮使用react

javascript - 使用javascript获取具有多个下拉菜单的选项的选定值

javascript - Select2 自动触发事件变化

javascript - 在 JavaScript 中检测按键序列

javascript - jQuery.click() 与 onClick

python - MousePressEvent 捕获不必要的信号 - PyQt4

javascript - 用于验证逗号分隔年份范围的正则表达式