javascript - DOM - 同时事件的计时与 setTimeout

标签 javascript dom language-lawyer dom-events event-loop

假设我有一个包含多个子元素的元素,并且希望在鼠标进入或离开容器时运行一些代码。如果我天真地写:

var onHover = function (el, f) {
    el.addEventListener('mouseover', function () {
        f(true);
    });
    el.addEventListener('mouseout', function () {
        f(false);
    });
};

然后,在某些情况下我会得到所需的行为 - 取决于回调 f 的性质。但是,当鼠标在容器内从一个子项移动到另一个子项时,f(false) 会立即运行,随后 f(true) 也会运行。我不希望这种情况发生 - 我只希望当鼠标进入或离开整个容器时运行 f ,而不是当用户将鼠标拖动到元素上时称为机关枪样式位于容器内。

这是我想出的解决方案:

var onHover = function (el, f) {
    var previousMouseover = false;
    var receivedMouseover = false;
    var pushing = false;
    var pushEv = function () {
        if (pushing) { return; }
        pushing = true;
        setTimeout(function () {
            pushing = false;
            if (previousMouseover !== receivedMouseover) {
                f(receivedMouseover);
                previousMouseover = receivedMouseover;
            }
        });
    };
    el.addEventListener('mouseover', function () {
        receivedMouseover = true;
        pushEv();
    });
    el.addEventListener('mouseout', function () {
        receivedMouseover = false;
        pushEv();
    });
};

此解决方案与第一个解决方案一样,假设并通过以下优点进行工作:mouseout 事件在 mouseover 事件之前发送。我还想知道 that 是否由任何 W3C 文档正式指定,但这不是这个问题的主题,即使不是这样,编写一个函数也很容易尽管如此,通过设置两个单独的变量,例如在 mouseovermouseout 回调中设置 receivedMouseoverreceivedMouseout ,然后在 setTimeout 回调内部检查两者。

问题是:是否需要在任何 setTimeout 之前处理 mouseovermouseout 事件由任一事件注册的回调是否运行?

最佳答案

使用 mouseentermouseleave 事件,而不是 mouseovermouseout

关于javascript - DOM - 同时事件的计时与 setTimeout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50053259/

相关文章:

javascript - CKEditor 如何允许所有标签使用所有样式,同时仍然限制标签本身

javascript - Polymer google-signin 元素获取无法读取 null 的属性 'currentUser'

c++ - 显式成员特化

c++ - 函数指针定义中是否允许使用参数名称

javascript - Contenteditable 元素修改后会更改 ID

c++ - `A a = A()` 有效吗?下面调用了哪些运算符/方法?

javascript - HTML5 Canvas/Fabric js 中的动画 while 循环

javascript - 从动态创建的输入和选择字段中获取值

javascript - 在 OpenCart 中自动隐藏警报消息

JavaScript:将子项附加到元素