事实上,当我使用
setTimeout(a(),60);
setTimeout(a(),120);
setTimeout(a(),180);
setTimeout(a(),240);
函数调用之间应该有 60 毫秒的间隔。
但它不是,尤其是当它在页面加载或动画元素期间被触发时。事实上,当浏览器“有艰苦的工作要做”时,差距甚至会长 2 倍。在某些情况下,它可以很容易地看到。
问题的关键是 - 还有其他方法可以在 javascript 中及时同步事件或函数吗?
事实上,当我使用
setTimeout(a(),60);
setTimeout(a(),120);
setTimeout(a(),180);
setTimeout(a(),240);
函数调用之间应该有 60 毫秒的间隔。
但它不是,尤其是当它在页面加载或动画元素期间被触发时。事实上,当浏览器“有艰苦的工作要做”时,差距甚至会长 2 倍。在某些情况下,它可以很容易地看到。
问题的关键是 - 还有其他方法可以在 javascript 中及时同步事件或函数吗?
简单来说,时间setTimeout(a(),60)
转换为I will run this function no earlier than 60ms, but if I get busy it could be later than that
。
因此,setTimeout
不承诺何时执行,只承诺在给定时间之后的某个时间(以毫秒为单位)。
因此,要回答您的问题,没有办法保证执行时间,setTimeout
但是您可以在 DOM 加载后加载脚本,这样 JavaScript 就不再忙于加载其他内容了。在 jQuery 中,您可以$(document).ready()
为此目的使用该函数。
阅读 John Resig 的这篇文章,了解更多关于 JavaScript 计时的信息:http: //ejohn.org/blog/how-javascript-timers-work/
尝试这个:
setTimeout(a,60);
setTimeout(a,120);
setTimeout(a,180);
setTimeout(a,240);
请注意,该函数没有()
s。
在您的特定情况下,setInterval()可能会起作用:
var count = 0, interval = setInterval(function() {
count += 1;
if (count > 4) {
clearInterval(interval);
} else {
a();
}
}, 60);
请注意,jQuery 有一个内置的动画功能,它使用不同的更好的方法,将动画简单地视为时间的函数并经常检查时钟,因此意外的延迟只会使动画不太流畅。