<script type="text/javascript"> window.onload=function(){ var oLi=document.getElementsByTagName("li"); for(var i=0;i<oLi.length;i++){ var iMumber=0; var arr=[]; var oP=oLi[i].getElementsByTagName('p')[0]; oP.timer=null; oP.iAlpha=0;//我现在只有这一个疑问,这个属性我把他换成变量(如:var iNum=0)在把下面的所有oP.iAlpha都给替换成iNum它的淡入淡出效果就会变的一闪一闪的很不流畅,这是什么原因 oLi[i].onmouseover=function(){ var oP=this.getElementsByTagName('p')[0]; oP.timer?clearInterval(oP.timer):""; oP.iAlpha=100; oP.style.opacity=1; oP.style.filter='alpha(opacity='+oP.iAlpha+')'; } oLi[i].onmouseout=function(){ doMove(this.getElementsByTagName('p')[0]); } function doMove(obj){ obj.timer?clearInterval(obj.timer):""; obj.timer=setInterval(function(){ var iSpeed=5; if(obj.iAlpha<=iSpeed){ clearInterval(obj.timer); obj.timer=null; obj.iAlpha=0; }else{ obj.iAlpha -=iSpeed; } obj.style.opacity=obj.iAlpha/100; obj.style.filter='alpha(opacity='+obj.iAlpha+')'; },50); } } } </script> <div id="box"> <ul class="oUl"> <li> <p></p> <div> <a target="_blank" href="baiduc.com">集合一</a> </div> </li> <li> <p></p> <div> <a target="_blank" href="baiduc.com">集合二</a> <span>2011-03-27</span> </div> </li> </ul> </div>
当把 oP.iAlpha 换成 var iNum=0,则所有的 li 节点mouseover、mouseout时,访问的都是同一个 iNum变量
假设现在从 A 节点移出,移如B节点,过程如下:
1)触发A的mouseout事件,假设当前iNum的值为100,则每隔50ms改变iNum的值
2)触发B的mouseover事件,将iNum设置为100
需要注意的是,步骤1)是采取setInterval计时器,从开始到完成需要执行20次,假设分别为 T0、T1、T2。。。T19
在这29个T的执行空隙列,1)事件可能触发,并将iNum设置为100
于是悲剧了,步骤1)的理想步骤本来是 iNum 从100->0,现在可能变成 100->50->100->0
大匙能不能用再通俗的字眼来解释下,我貌似能懂些了,只是还是有点点困惑
@严文Live2012:
关键点是:这里多个节点(li),每个节点的渐隐动画都用到了同一个变量iNum,他们同时都在对它进行修改,且修改的次序很难保证。