javascript 与图片预加载的遭遇

原创 2015年11月21日 13:51:56
这几天工作中(博主今年大三,刚开始实习)遇到一个让我十分郁闷的问题那就是图片预加载时错误问题,最初我的做法是这样
  var Lurls = [
            'image/low/img2.jpg',
            'image/low/img4.jpg',
            'image/low/img0.jpg',
            'image/low/img5.jpg',
            'image/low/img1.jpg',
            'image/low/img3.jpg'
        ];

  var imgs = [];
 function ImgLoad(urls)
        {
            for(var i=0;i<urls.length;i++)
            {
                var img = new Image();
                img.src = urls[i];
;
                if (img.complete)
                {

                  //火狐浏览器在这里工作,运行良好,后来发现不用img.complete也可以运行因为火狐也可以异步加载图片

                }
                else
                {
               //谷歌浏览器跳过这些步骤,在所有代码运行完之后才运行onload函数
                        img.onload = function ()
                        {
                            callback(img);
                        };
                        img.src = urls[i];
                }

            }

        }
function callback(img)
{
     imgs.push(img);  
}

但是问题也来了,每次图片加载时在火狐上运行良好,但是在谷歌和IE上运行时就只能得到最后一张图片,数组中保存的6张图片完全相同。这让我百思不得其解。

后来我发现回调函数是将图片放入数组时,数组中已经存在的内容就会被覆盖掉。对于这一点我的理解是:当回调时img作为参数被返回回调函数被加入数组中,但在后续的返回中由于所有的img公用一块内存(不知道合不合适,我以前学c++是就是这样),而数组中的元素都指向img的地址。也就是说每当img回调是img的内容被替换掉了,而地址没变,数组中的元素都指向img这也就造成了后面的图片会覆盖掉前面的内容。

然后我就换了种方法

</pre><pre style="font-family: 宋体; font-size: 9pt; background-color: rgb(255, 255, 255);"><pre name="code" class="javascript">for(var i=0;i<Lurls.length;i++)
        {
            ImgLoad(Lurls[i]);
        }

       //加载低画质
        function ImgLoad(url)
        {
            var img = new Image();
            img.onload = function ()
            {
                callback(img);
            };
            img.src = url;
        }<pre style="font-size: 9pt; font-family: 宋体; background-color: rgb(255, 255, 255);"><span style="color: rgb(0, 0, 128); "><strong>function </strong></span><span style="font-style: italic;">callback</span>(img)
{
  imgs.push(img);
}


每次只加载一张,结果完全和我的想法一样,数组中的6张图片都被加载了进去。

最后我改进了代码如下
 for(var i=0;i<Lurls.length;i++)
        {
            ImgLoad(Lurls[i]);
        }

       //加载低画质
        function ImgLoad(url)
        {
            var img = new Image();
            img.onload = function ()
            {
                callback(img);
            };
            img.src = url;
        }

        function callback(img)
        {    
            imgs.push(img);
        }

完美解决了问题。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

javascript图片预加载技术(详细演示)

本文所提到的预加载技术主要是让javascript快速获取图片头部数据的尺寸。 一段典型的使用预加载获取图片大小的例子:  复制代码代码如下: var imgLoad = f...

javascript图片预加载技术

lightbox类效果为了让图片居中显示而使用预加载,需要等待完全加载完毕才能显示,体验不佳(如filick相册的全屏效果)。javascript无法获取img文件头数据,真的是这样吗?本文通过一个巧...

javascript图片预加载实例分析

本文实例讲述了javascript图片预加载的方法。分享给大家供大家参考。具体如下: lightbox类效果为了让图片居中显示而使用预加载,需要等待完全加载完毕才能显示,体验不佳(如filick...

Javascript实现图片的预加载的完整实现

图片预加载是web开发中一种应用相当广泛的技术,比如我们在做图片翻转显示等特效的时候,为了让图片在转换的时候不出现等待,我们最好是先让图片下载到本地,然后在继续执行后续的操作。今天我们将来实现一个完整...

利用CSS、JavaScript及Ajax实现图片预加载的三大方法

预加载图片是提高用户体验的一个很好方法。图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度。这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布...

javascript设计模式实践之代理模式--图片预加载

图片的预加载就是在加载大图片前,先显示一个loading.gif,就算在网络比较慢的时候也能让人知道正在加载,总比啥反应都没有强。 下面这段代码就是预加载的一个简单的实现,假设先不处理加载图片时的o...

利用CSS、JavaScript及Ajax实现图片预加载的三大方法

Perishable Press网站近日发表了一篇文章《3 Ways to Preload Images with CSS, JavaScript, or Ajax》,分享了利用CSS、JavaScr...

利用CSS、JavaScript及Ajax实现图片预加载

预加载图片是提高用户体验的一个很好方法。图片预先加载到浏览器中,这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速、无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验。本文将...

利用CSS、JavaScript及Ajax实现图片预加载方法

方法一:用CSS和JavaScript实现预加载 实现预加载图片有很多方法,包括使用CSS、JavaScript及两者的各种组合。这些技术可根据不同设计场景设计出相应的解决方案,十分高效。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)