javascript - 尽管有 clearTimeout,setTimeout 仍然会触发

标签 javascript jquery settimeout cleartimeout

我有以下功能。目的是当您将鼠标悬停在具有 .toolTip 类的项目上时,它会在 3 秒后记录您悬停在该元素上的 data-tooltip。但是,如果您的光标离开该项目,它应该取消 setTimeout 并且不显示消息。

“Timeout set”和“Timeout cleared”消息按预期触发,但指定函数仍会触发。我做错了什么?

$(document).on("hover",".toolTip", function() {
    var toolTip = $(this);
    var toolTipMessage
    var hoveringNow = toolTip.attr("data-hovering-now");
    if(typeof hoveringNow !== typeof undefined && hoveringNow !== false) {
        toolTip.removeAttr('data-hovering-now');
        clearTimeout(toolTipMessage);
        console.log('Timeout cleared');
    }
    else {
        toolTip.attr('data-hovering-now', true);
        toolTipMessage = setTimeout(showToolTip, 3000, toolTip.attr("data-tooltip"));
        console.log('Timeout set');
    }               
});

function showToolTip(message) {
    console.log(message);
}

最佳答案

您的变量 toolTipMessage 仅存在于悬停时执行的函数的执行上下文中,下次悬停该元素时,该变量不再存在(或者,更确切地说,您有一个不同同名变量)。

要使变量在两次执行之间保持不变,您需要在封闭的执行上下文中定义该变量 - 例如在 hover 处理程序之外。

var toolTipMessage = null;
$(document).on("hover",".toolTip", function() {
   ....
});

关于javascript - 尽管有 clearTimeout,setTimeout 仍然会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35314504/

相关文章:

javascript - appendChild 到 h2 类

javascript - 点击后退按钮后停止 Angular $timeout 计时器

javascript - 使用 knockout 技术在 html 元素中绑定(bind)文本值

javascript - Javascript 如何区分 Json 对象和字符串?

JQuery - 一个连续的滚动导航,除了它不太管用

javascript - 如何在两个异步函数完成后运行函数

javascript - 如何随机化旋转圆的速度?

javascript - 从变量获取 json 响应?

javascript - 当变量选择数组中的元素时,为什么 Node 看不到该元素?

javascript - 如何将axios响应数据提取到vuejs中的变量中