Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用JS构建通知卡,该通知卡在X秒后消失,但计时器在悬停时重置_Javascript_Dom_Settimeout_Dom Events - Fatal编程技术网

Javascript 使用JS构建通知卡,该通知卡在X秒后消失,但计时器在悬停时重置

Javascript 使用JS构建通知卡,该通知卡在X秒后消失,但计时器在悬停时重置,javascript,dom,settimeout,dom-events,Javascript,Dom,Settimeout,Dom Events,我正在使用React构建一个组件,当用户完成一个操作时,该组件将充当通知卡。行为将是这样的: 当用户在论坛上创建帖子时,卡片将显示在底部,固定。如果用户在它上面停留4秒,它将消失。如果鼠标悬停在卡上,计时器将重置,鼠标离开卡时,计时器将再次从4开始倒数 以下是我的逻辑相关代码: let elem = document.getQuerySelector('card'); let loop = (el) => { let timer = setTimeout(() => {

我正在使用React构建一个组件,当用户完成一个操作时,该组件将充当通知卡。行为将是这样的:

当用户在论坛上创建帖子时,卡片将显示在底部,固定。如果用户在它上面停留4秒,它将消失。如果鼠标悬停在卡上,计时器将重置,鼠标离开卡时,计时器将再次从4开始倒数

以下是我的逻辑相关代码:

let elem = document.getQuerySelector('card');

let loop = (el) => {
    let timer = setTimeout(() => {
        hide();
    }, duration);

    el.addEventListener('mouseover', () => {
        clearTimeout(timer);
        el.addEventListener('mouseout', () => { 
            // let elClone = el.cloneNode(true);
            // el.parentNode.replaceChild(elClone, el);
            loop(el);
        });
    });

}

loop(elem)

这段代码可以工作,但它最终会向元素附加不必要数量的冗余EventListener。我试图在mouseout之后通过克隆和替换元素来删除所有事件侦听器,但这对我来说不起作用;相反,如果我使用这种方法,卡不会消失

使用
mouseenter
mouseout
怎么样,这样只需添加一次侦听器就可以了

let elem = document.querySelector('card');

let loop = (el) => {
    let timer = setTimeout(() => {
        hide();
    }, duration);

    el.addEventListener('mouseenter', () => {
        clearTimeout(timer);
    });

    el.addEventListener('mouseout', () => { 
        // let elClone = el.cloneNode(true);
        // el.parentNode.replaceChild(elClone, el);
        timer = setTimeout(()=>{hide()}, duration);
    });
}

loop(elem)

也许使用state可以为您提供更多实现这一点的选项。如果其他人没有回答这个问题,我会试一试,然后发回。我认为你不需要用React来回答,我认为他们有设置eventlisteners的替代方案。但是可能是错误的。我对代码进行了一些编辑,这样它就不会递归调用循环。无论我编写了什么代码,尽管与React无关,但都是基于逻辑的,避免了多事件侦听器注册。这很完美,谢谢!我甚至没有想过使用state@DanielZuzevich,但这也会奏效。我认为这个答案要简单得多。