[英]Why doesn't setTimeout work as expected?
我试图每次将鼠标指针悬停在<div id="box">
上时,但它似乎仅在我将mouseover
在div上时才移动,而不是在鼠标悬停在div上时移动。
document.getElementsByTagName("body")[0].addEventListener("load",init());
function init(){
console.log('in init');
document.getElementById("box").addEventListener("mouseover",function(){
var pixels=5;
var perMs=40;
var repeater=setTimeout(moveBox(pixels),perMs);
document.getElementById("box").addEventListener("mouseout",function(){
console.log('mouseOut');
clearTimeout(repeater);
});
});
}
function moveBox(pixels){
console.log('moveBox');
var leftBox=document.getElementById("box").style.left;
leftBox=parseInt(leftBox)+pixels;
document.getElementById("box").style.left=leftBox;
}
setTimeout将回调函数作为第一个参数,问题是moveBox(pixels)执行该函数并返回它的结果,因此您应该将其包装到另一个函数中。
另外,您每次在mouseover回调中订阅“ mouseout”事件时都希望取消订阅:
function init(){
console.log('in init');
document.getElementById("box").addEventListener("mouseover",function(){
var pixels=5;
var perMs=40;
var repeater=setTimeout(function(){moveBox(pixels)},perMs);
document.getElementById("box").addEventListener("mouseout",function onMouseOut(){
console.log('mouseOut');
clearTimeout(repeater);
document.getElementById("box").removeEventListener("mouseout",onMouseOut);
});
});
}
您的代码中有许多语法问题,其中的主要问题已得到纠正。
function init() {
console.log('in init');
var box = document.getElementById("box"),
pixels = 5,
perMs = 40,
repeater;
function moveBox(pixels) {
console.log('moveBox', pixels);
var boxLeft = parseInt(box.style.left, 10) || 0;
box.style.left = (boxLeft + pixels) + 'px';
}
box.addEventListener("mouseover", function() {
repeater = setTimeout(moveBox, perMs, pixels);
});
box.addEventListener("mouseout", function(){
console.log('mouseOut');
clearTimeout(repeater);
});
}
document.getElementsByTagName("body")[0].addEventListener("load",init);
请注意, setTimeout
仅被调用一次,不会重复。
演示在这里: https : //jsfiddle.net/vqgesj58/1/
如果您希望在鼠标悬停时移动它的框,我将更新代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.