You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript如何实现mouseenter触发后循环执行代码直到鼠标移出元素

解决方案

你的问题核心是没有在鼠标移出时清除定时任务,递归创建的setTimeout会一直循环执行。另外你的代码里存在拼写错误:addEventListner应为addEventListener,少了字母e。
具体实现可以参考以下逻辑:

  • 在事件回调外部声明变量存储定时器ID,保证mouseenter和mouseleave两个事件回调都能访问到该变量
  • mouseenter触发时启动定时任务,将返回的定时器ID存入变量
  • mouseleave触发时清除对应的定时器,终止循环执行

完整代码示例

递归setTimeout版本(和你原有实现逻辑对齐)

const divItem = document.getElementById("option")
// 存储定时器ID,作用域覆盖两个事件回调
let timerId = null

divItem.addEventListener("mouseenter", () => {
    // 先清除已有定时器,避免重复hover导致多个定时器同时运行
    if (timerId) clearTimeout(timerId)
    
    const timeoutEvent = () => {
        console.log("Mouse is entered")
        timerId = setTimeout(timeoutEvent, 4000)
    }
    // 首次触发立即执行一次,也可以删除这行调整为4秒后第一次执行
    timeoutEvent()
})

divItem.addEventListener("mouseleave", () => {
    // 鼠标移出时清除定时器
    if (timerId) {
        clearTimeout(timerId)
        timerId = null
    }
})

setInterval版本(逻辑更直观)

const divItem = document.getElementById("option")
let intervalId = null

divItem.addEventListener("mouseenter", () => {
    if (intervalId) clearInterval(intervalId)
    // 首次触发立即打印
    console.log("Mouse is entered")
    intervalId = setInterval(() => {
        console.log("Mouse is entered")
    }, 4000)
})

divItem.addEventListener("mouseleave", () => {
    if (intervalId) {
        clearInterval(intervalId)
        intervalId = null
    }
})

内容的提问来源于stack exchange,提问作者Mayukh Chakraborty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:54:04