在 JavaScript 中阻止顺序执行的唯一方法是创建一个繁忙的循环(或使用类似的阻塞函数alert
):但您不希望这样做,因为它会冻结用户界面- 包括更新元素移动的 UI 显示!
相反,构建代码使其使用异步回调- 此模型允许浏览器事件循环不间断地继续,以便它可以对用户输入做出反应并根据 DOM 更改更新显示。
document.getElementById('power').play();
document.getElementById('shot').style.visibility='visible';
var i = 140;
function moveIt() {
imgShot.style.left = parseInt(imgObj.style.left) - 130 + 'px';
imgShot.style.top = parseInt(imgObj.style.top) - i + 'px';
i++;
if (i < 400) {
// If have more, schedule again in .5s
// Remember that setTimeout *returns immediately* because it
// is an asynchronous operation.
setTimeout(moveIt, 500);
} else {
// This will be executed when animation finishes.
}
}
moveIt();
// This will be executed after first movement which is well before
// the animation finishes. We could also use setTimeout(moveIt, ..) here,
// depending on what is desired.
或者,更好的是,使用类似的东西jQuery.animate
来处理大部分重复的东西。(您可能必须为这种情况编写自定义缓动,因为运动是从沿 y 轴的非 0 初始值线性加速的。)
setInterval
也可以使用(完成后取消它,而不是开始新的超时),但我发现这种setTimeout
方法在概念上更容易展示。不同之处在于,setInterval
它将尝试始终在 time=iteration*timeout 时运行,这可以 - 在退化的情况下 - 比多个 setTimeout 调用更加一致,或者正如 Alnitak 所指出的,它可以有害地堆叠/级联。