
[英]How to stop toggle event from being fired multiple times on mouseenter/mouseleave?
[英]How to stop a setInterval fired by mouseenter, upon mouseleave?
我已经成功地得到它在滚动一个div的溢出箭头mouseenter
工作。 问题在于该脚本不仅不会在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
和timer
它里面,大干快上禁用mouseleave
。
您只需创建一个全局计时器变量即可存储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">
每次scroll_right
函数运行时都会设置计时器。 一段时间后的某个时间将运行无限多个计时器。 您可以尝试使用setTimeout
函数而不是下面的函数。 同样,计时器的范围仅限于代码中的功能。
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; } }
<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>
您需要在函数外部声明计时器变量以供其他函数使用将JS替换为:
var timer;
function scroll_right() {
var elmnt = document.getElementsByClassName("thumbnails")[0];
elmnt.scrollLeft += 50;
timer = setInterval(scroll_right, 300);
}
function kill() {
clearInterval(timer)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.