问答详情
源自:6-2 完美运动框架

为什么这段代码有Bug

function MoveModelFn(obj,json,fn){
	//var flag=true;
	clearInterval(obj.timer);
	obj.timer=setInterval(function(){
		for(var attr in json){
			// 判断属性
			var icur=0;
			if (attr=='opacity') {
				icur =Math.round(parseFloat(getStyle(obj,attr))*100);
			}else{
				icur=parseInt(getStyle(obj,attr));
			}
			//设置速度
			var speed=(json[attr]-icur)/10;
			var speed=speed>0?Math.ceil(speed):Math.floor(speed);
			// 判断停止
			if(icur!=json[attr]){
				//flag=false;
				if (attr=='opacity') {
					obj.style.filter='alpha(opacity:'+(icur+speed)+')';//icur原始值+变化值speed
					obj.style.opacity=(icur+speed)/100;
				}else{
					obj.style[attr]=icur+speed+"px";
				}		
			}else	{
					clearInterval(obj.timer);
				// 回调函数
					if (fn) {
						fn();
				}
			}
		}	
		
	},30)

如果不设立标杆。用if()else 有有bug

提问者:甫里 2016-04-18 16:45

个回答

  • 慕的地1208773
    2016-04-20 17:46:02
    已采纳

    首先,else要放在for循环外面,否则,一旦某一个attr达到目标值,即icur==json[attr]成立,就完成了else的判断.会运行else的代码.

    其次,设立标杆的目的是为了方便取值,为else里面的代码进行成立与否的判断!!在for循环里面,程序会进行分次判断,有几个attr就会判断几次,只要有一个false,返回值就是false,如果不设立标杆,会出现某次是true,某次是false的结果,无法进行后面的else判断.

    只要有一个attr达到目标值,icur==json[attr]的等式就会成立(就是说这个等式无法作为else执行判断的依据),也就是else的代码就会执行,计时器就会清除.

  • 我懒得说什么
    2016-04-18 18:02:42

    没问题呀