setTimeout和setInterval的区别:
setTimeout()是延时器,setInterval()是定时器,setTimeout()在执行的时,是在载入后延迟指定时间后,去执行一次表达式,次数是一次,而setInterval()则不一样,它从载入后,每隔指定的时间就执行一次表达式
setTimeout()
setTimeout()用于延时执行参数指定的代码,如果在指定的延迟时间之前,想取消这个执行,可以用clearTimeout(timerId) timerId 是 setTimeout 时返回的;
语法:
var timerId = setTimeout(func|code, delay)
code/function 必需。要调用一个代码串,也可以是一个函数。
milliseconds 可选。执行或调用 code/function 需要等待的时间,以毫秒计。默认为 0。
<button onclick="fun()">点我</button>
<button onclick="myStopFunction()">阻止弹出</button>
var timerId;
function fun() {
timerId = setTimeout(function () {
alert("Hello")
}, 3000);
}
function myStopFunction() {
clearTimeout(timerId);
}
setInterval()
setInterval()用于每隔一段时间执行指定的代码,永无停歇,想清除它,可以使用 clearInterval(intervalId),这样从调用 clearInterval intervalId 是 setInterval 时返回的;
语法:
setInterval(code, milliseconds);
setInterval(function, milliseconds, param1, param2, ...)
code/function 必需。要调用一个代码串,也可以是一个函数。
milliseconds 必须。周期性执行或调用 code/function 之间的时间间隔,以毫秒计。
<p>显示时间:<span id="date"></span></p>
<button onclick="clearTime()">停止时间</button>
var mTime = setInterval(function () {
oTime()
}, 1000);
function oTime() {
var date = new Date();
var time = date.toLocaleTimeString();
document.getElementById('date').innerHTML = time;
}
function clearTime() {
clearInterval(mTime);
}
requestAnimationFrame(code)
requestAnimationFrame(code),一般用于动画,与 setTimeout 方法类似,区别是 setTimeout 是用户指定的,而 requestAnimationFrame 是浏览器刷新频率决定的,一般遵循 W3C 标准,它在浏览器每次刷新页面之前执行。
语法:
window.requestAnimationFrame(callback);
requestAnimationFrame 比起 setTimeout、setInterval的优势主要有两点:
1、requestAnimationFrame 会把每一帧中的所有DOM操作集中起来,在一次重绘或回流中就完成,并且重绘或回流的时间间隔紧紧跟随浏览器的刷新频率,一般来说,这个频率为每秒60帧。
2、在隐藏或不可见的元素中,requestAnimationFrame将不会进行重绘或回流,这当然就意味着更少的的cpu,gpu和内存使用量。
注: IE9-浏览器不支持该方法
<div style="border:1px solid #ddd; 500px;margin: 50px 0 10px;">
<div id="box">0%</div>
</div>
<button id="btn">点击</button>
var timer;
btn.onclick = function () {
box.style.width = '0';
timer = requestAnimationFrame(function fn() {
if (parseInt(box.style.width) < 500) {
box.style.width = parseInt(box.style.width) + 5 + 'px';
box.innerHTML = parseInt(box.style.width) / 5 + '%';
timer = requestAnimationFrame(fn);
} else {
cancelAnimationFrame(timer);
}
})
}