如何在mouseleave上停止由mouseenter触发的setInterval?

时间:2018-05-24 11:16:58

标签: javascript scroll setinterval mouseover mouseenter

我设法获得箭头,滚动mouseenter上div的溢出来工作。问题是脚本不仅不会在mouseleave停止,而且会阻止手动滚动div对面。

JS

function scroll_right() {
        var elmnt = document.getElementsByClassName("thumbnails")[0];
            elmnt.scrollLeft += 50;
        var timer = setInterval(scroll_right, 300); 
}

function kill() {
        clearInterval(timer)
}

箭头

<img class="arrow" 
 onmouseenter="scroll_right()"
 onmouseleave="kill()" 
 src="https://image.flaticon.com/icons/svg/126/126490.svg">

我的想法是scroll_right函数在mouseenter上被触发,其内部的timermouseleave上被停用。

3 个答案:

答案 0 :(得分:4)

您只需创建一个全局计时器变量,该变量将存储setInterval()值,以便您可以使用它来停止setInterval运行。

    var timer = undefined;

    function scroll_right() {
        var elmnt = document.getElementsByClassName("thumbnails")[0]; 
        elmnt.scrollLeft += 50;
        timer && clearInterval(timer);
        timer = setInterval(scroll_right, 300); 
    }

    function kill() {
        timer && clearInterval(timer)
    }

---------这是html代码

<img class="arrow" 
 onmouseenter="scroll_right()"
 onmouseleave="kill()" 
 src="https://image.flaticon.com/icons/svg/126/126490.svg">

答案 1 :(得分:1)

每次运行scroll_right函数时都会设置计时器。一段时间后,有一段时间会有无限多的计时器运行。您可以尝试使用setTimeout功能而不是下面的功能。此外,计时器的范围仅限于代码中的功能。

&#13;
&#13;
var timer = undefined;

function scroll_right() {
  var elmnt = document.getElementsByClassName("thumbnails")[0];
  elmnt.scrollLeft += 50;
  if (!timer) {
    timer = setInterval(scroll_right, 300);
  }
}

function kill() {
  if (timer) {
    clearInterval(timer);
    timer = undefined;
  }
}
&#13;
<div class="thumbnails" onmouseenter="scroll_right()" onmouseleave="kill()" style="width:150px;overflow:auto">
  <img class="arrow" src="https://image.flaticon.com/icons/svg/126/126490.svg" width="500px">
</div>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您需要声明函数外部的定时器变量以供其他函数使用 用以下代码替换你的JS:

var timer;
function scroll_right() {
    var elmnt = document.getElementsByClassName("thumbnails")[0];
    elmnt.scrollLeft += 50;
    timer = setInterval(scroll_right, 300); 
}

function kill() {
    clearInterval(timer)
}