发新贴  快速回复

请看看为什么这个变量不能递增

ゞ馬^(00)^
2013-07-30 21:57
<script type="text/javascript">

var iNum=0;

for(var i=1;i<20;i++)
{
    var oImg=new Image();

    oImg.src='http://g.hiphotos.baidu.com/album/w%3D2048/sign=74c55710d8f9d72a1764171de0122934/30adcbef76094b36c22628c2a2cc7cd98d109d6c.jpg';
    
    oImg.width='130';
    
    oImg.err==function ()
    {
        //alert('成功');
        
        iNum++;
        
        //document.title=iNum  ->放在这里的时候iNum可以显示递增
    }
    
    document.body.appendChild(oImg);
}

//document.title=iNum  ->放在这里的时候iNum就不显示递增
</script>

-------------------------------------------------------------------------------------------------

JS代码如上,请问为什么当iNum放在oImg.onload的时候iNum就可以递增,但是放在onload外面就不行了,这是为什么?
创美易-miaov
肯定不行哈,作用域问题。
2013-07-30 22:07  回复本帖
 
zmouse
写在外面就执行一次,怎么会递增呢?
写在onload里面,那么图片加载完成一张就会执行一次,所以就递增了
2013-07-30 22:38  回复本帖
ゞ馬^(00)^
创美易-miaov 发表于 2013-7-30 22:07 forum.php?mod=redirect&goto=findpost&pid=20637&ptid=7002
肯定不行哈,作用域问题。

我这个iNum执行递增是在onload里面,如果把document.title=iNum放到onload里面就有值,放到onload外面就是0;您说的这个作用域是说的哪个,我有点云里雾里,求详解
2013-07-30 22:58  回复本帖
ゞ馬^(00)^
zmouse 发表于 2013-7-30 22:38 forum.php?mod=redirect&goto=findpost&pid=20640&ptid=7002
写在外面就执行一次,怎么会递增呢?
写在err=里面,那么图片加载完成一张就会执行一次,所以就递增了 ...

我这个iNum的递增是写在onload里面的啊,但是document.title=iNum这个输出值的语句只是输出iNum的值,写在哪里不一样么
2013-07-30 23:01  回复本帖
无为
ゞ馬^(00)^ 发表于 2013-7-30 23:01 forum.php?mod=redirect&goto=findpost&pid=20642&ptid=7002
我这个iNum的递增是写在err=里面的啊,但是document.title=iNum这个输出值的语句只是输出iNum的值,写 ...

代码正常执行只会执行一次,也就是在你打开页面的时候 document.title=iNum 只会执行一次,只执行一次当然只会输出一次,输出一次你当然就看不到递增。

放在err=里其实也只是执行一次,但是因为 for 循环重复调用了很多次,也就是执行了很多次  onload事件,每执行一次事件就递增一次,所以你才能看到递增效果。

不管你 document.title=iNum 这句话放哪,iNum都是有递增的,只是输出的次数的问题。
2013-07-31 18:25  回复本帖
ゞ馬^(00)^
 本帖最后由 ゞ馬^(00)^ 于 2013-8-1 13:35 编辑 

无为 发表于 2013-7-31 18:25 forum.php?mod=redirect&goto=findpost&pid=20660&ptid=7002
代码正常执行只会执行一次,也就是在你打开页面的时候 document.title=iNum 只会执行一次,只执行一次当 ... <script type="text/javascript">

var iNum=0;

var b=false;

for(var i=1;i<20;i++)
{
    var oImg=new Image();

        oImg.src='http://g.hiphotos.baidu.com/album/w%3D2048/sign=74c55710d8f9d72a1764171de0122934/30adcbef76094b36c22628c2a2cc7cd98d109d6c.jpg';
        
        oImg.width='130';
        
        oImg.err==function ()
        {
                //alert('成功');
                
                iNum++;

                b=true;
                
                //document.title=iNum  ->放在这里的时候iNum可以显示递增
        }
        
        document.body.appendChild(oImg);

        //document.title=iNum  ->放在for循环里面也不显示递增
        //alert(b) ->false,这里也是false
}

//document.title=iNum  ->放在这里的时候iNum就不显示递增
//alert(b)  ->false;这里也是false
</script>您说这个iNum实际已经递增,只是输出次数的问题,但是我把这个iNum放在for循环里面document.title=iNum显示的还是0;我又新建了一个变量b=false;在oImg.onload的时候b=true,但是后面输出的时候不管在for循环里面还是外面都是b=false。请问这是为什么呢?是不是新创建的对象和外面不互通呢?
2013-07-31 20:07  回复本帖
ゞ馬^(00)^
自己先顶一个,希望高手来帮小弟解答
2013-08-01 13:35  回复本帖
无为
ゞ馬^(00)^ 发表于 2013-7-31 20:07 forum.php?mod=redirect&goto=findpost&pid=20666&ptid=7002
您说这个iNum实际已经递增,只是输出次数的问题,但是我把这个iNum放在for循环里面document.title=iNum显示 ...

这是代码加载时间的问题,js从上到下执行很快,但是 img.err=事件是要等图片加载完成之后才会执行的。

也就是说,当你这段代码执行到 alert(b) 的时候,图片还没有加载完成呢,这个时候b的值当然还是 false。

代码能执行到 alert(b) 这一行,不代表err=事件里的代码也已经执行了,其实并不一定会执行,比如你这个例子,因为加载图片需要时间,而js从上到下执行几乎是不需要什么时间的。

就像 有甲乙两辆车,他们同时从A点出发去往B点,起点和目标点都是一样的。甲的速度是100,而且走的是快捷通道,绝对不会堵车,乙的速度不确定,路面好就快点,路面差就慢点,而且路上还经常要堵车。那当甲到达B点的时候,乙车能同时到达B点么?

js代码执行速度是很快的,就像甲车,而图片的加载速度是受图片大小,网络带宽影响的,就像乙车。
2013-08-01 14:20  回复本帖
无为
ゞ馬^(00)^ 发表于 2013-8-1 13:35 forum.php?mod=redirect&goto=findpost&pid=20680&ptid=7002
自己先顶一个,希望高手来帮小弟解答

我个人觉得你的基础知道不是很扎实,建议多看看妙味课堂的基础视频教程。
2013-08-01 14:20  回复本帖
ゞ馬^(00)^
{:soso_e179:} thank you,明白了
2013-08-01 16:35  回复本帖
登录 后才可以发表回复