定时器的问题
定时器常识性问题
- 定时器中函数的this始终指向window
setInterval(function(){
console.log(this) //window
},100)
- 如何在定时器正确的输出1,2,3,4,5
//错误的想法
for(var i = 0; i < 5 ;i++){
setInterval(function(){
console.log(i)
},100)
}
//
//把i当参数传递进去
for(var i = 0; i < 5 ;i++){
setInterval((function(arg){
console.log( arg )
})(i),100)
}
//把i当参数传递进去
for(var i = 0; i < 5 ;i++){
(function(i){
setInterval(function(){
console.log( i )
},100)
})(i)
}
- 拿到i 有什么作用来个大栗子
var adiv = document.getElementsByTagName('div');
for (var i =0;i < adiv.length ;i++) {
adiv[i].onclick = function(){
//adiv[i].style.background = "pink"
console.log(i) //如何正确的获取到i
}
}
//做选项卡的时候 ,以前通用的使用添加索引值的玩法
//第一种写法
for (var i =0;i < adiv.length ;i++) {
adiv[i].onclick = (function(arg){
return function(){
console.log(arg)
}
})(i)
}
//第二种写法
for (var i =0;i<adiv.length;i++) {
(function(arg){
adiv[i].onclick = function(){
console.log(arg)
}
})(i)
}
定时器的执行顺序问题 ---第一坑
//执行顺序问题
setInterval(function(){
console.log(2)
},100)
console.log(1)
//当定时器的时间设置为0的时候,执行顺序
setInterval(function(){
console.log(2)
},0) ;
console.log(1)
详情可见:深入理解JavaScript定时机制和定时器注意问题===
定时器有关的案例,都有一个浏览器本身的bug ---第二坑
当页面不可见(最小化)的时候,浏览器为了性能考虑,会定时器减缓,减缓的幅度是未知的
如何解决这个bug呢
window.onfocus = function(){
console.log(1);
timer = setInterval(handle,2000);
};
window.onblur = function(){
console.log(2);
clearInterval(timer);
};
- h5 新增的页面可见性的api
function handleVisibilityChange() {
if (document.hidden) {
//如果页面处于被认为是对用户隐藏状态时返回true,否则返回false。
oCtrl.pause()
} else {
console.log(2)
oCtrl.play()
}
}
document.addEventListener("visibilitychange", handleVisibilityChange, false);
普通版运动函数和时间版运动函数 ===第三坑
当作这种居中放大的例子的时候,普通版运动函数明显出现抖动的情况,匀速运动的时候,抖动比缓冲运动幅度较大
时间版运动函数则,在相同的时间内到达目标点,所以不会出现抖动
时间版运动函数利用的时twenn算法
function startMove(obj,json,times,fx,callback){
//先清除定时器
clearInterval(obj.timer)
//初始化值
var icur = {};
for (var attr in json) {
//icur存在的
icur[attr] = 0;
if(attr == "opacity"){
icur[attr] = parseInt(getStyle(obj,attr)*100)
}else{
icur[attr] = parseInt(getStyle(obj,attr))
}
}
obj.timer = setInterval(function(){
t = Math.min(changetime - starttime,times);
for (var attr in json) {
var value = Tween[fx](t, icur[attr], json[attr]-icur[attr], times);
obj.style[attr] = value + 'px';
}
},13)
function getStyle(obj,attr){
if(obj.currentStyle){
return obj.currentStyle[attr]
}else{
return getComputedStyle(obj,false)[attr]
}
}
}
//这里是tween算法里面的一种 详情见
var Tween = {
linear: function (t, b, c, d){ //匀速
return c*t/d + b;
}
}