美文网首页前端攻城狮
js中图片预载入与Image()类

js中图片预载入与Image()类

作者: 秋染蒹葭 | 来源:发表于2017-06-14 19:41 被阅读871次

预载入

在android混合开发中,webView的html页面在加载本地的图片的时候,假如图片过大(存储尺寸或者显示尺寸),经过测试,在手机上也可能出现界面加载闪烁。对于浏览器载入图像来说,只有在对图像发送一个 HTTP请求之后,它们才会被浏览器载入,对图像的 HTTP 请求要么使用 <img> 标记,要么通过方法调用实现。如果使用 JavaScript 脚本来处理更改图像,那么在从服务器获取图像时可能要等上几秒钟到几分钟的时间。如果使用一个慢速的 Internet 连接,或者要获取的图像非常大,或者其它一些情况,这种现象就特别明显;这样,延迟就造成你不能达到自己期望的效果,视觉上最明显的就是会闪屏或者白屏。

一些浏览器采用一些措施来缓解这一问题,比如试图通过在本地缓存中存储图像,从而使随后对图像的调用能够立即被满足;但是在图像第一次被调用时依然会存在一些延迟。预载入是在需要图像之前将其下载到缓存的一种方法。通过这一措施,当真正需要图像时,它就可以被立即从缓存中取出,从而能够立即显示

Image()对象

创建一个Image对象:var a=new Image(); 定义Image对象的src:a.src=”xxx.gif”; 这样做就相当于给浏览器缓存了一张图片。

  • 建立图像对象:图像对象名称=new Image([宽度],[高度])

  • 图像对象的属性: border complete height hspace lowsrc name src vspace width

  • 图像对象的事件:onabort onerror onkeydown onkeypress onkeyup onload

  • 需要注意的是:src 属性一定要写到 onload 的后面,否则程序在 IE 中会出错。

var img=new Image();  
    img.onload=function(){alert("img is loaded")};  
    img.onerror=function(){alert("error!")};  
    img.src="http://www.abaonet.com/img.gif";  
    function show(){alert("body is loaded");};  
    window.onload=show;  

在 FF 中,img 对象的加载包含在 body 的加载过程中,既是 img加载完之后,body 才算是加载完毕,触发 window.onload 事件。

在 IE 中,img 对象的加载是不包含在 body 的加载过程之中的,body 加载完毕,window.onload 事件触发时,img对象可能还未加载结束,img.onload事件会在 window.onload 之后触发。

根据上面的问题,考虑到浏览器的兼容性和网页的加载时间,尽量不要在Image 对象里放置过多的图片,否则在 FF 下会影响网页的下载速度。当然如果你在 window.onload 之后,执行预加载函数,就不会有 FF 中的问题了

onLoad() 事件处理器

像很多 JavaScript 的其它对象一样,Image() 对象也有一些事件处理器。其中最有用的一个肯定是 onLoad() 处理器,它在图像完全载入之后调用。这个事件处理器可以与一个自定义函数联系起来,以在图像完全载入之后执行一些特定的任务。

complete ()属性

可以通过Image对象的complete 属性来检测图像是否加载完成(每个Image对象都有一个complete属性,当图像处于装载过程中时,该属性值false,当发生了onload、onerror、onabort中任何一个事件后,则表示图像装载过程结束(不管成没成功),此时complete属性为true)

ie 火狐等大众浏览器均支持 Image对象的onload事件。

ie8及以下、opera 不支持onerror事件

eg:

<pre><code>
   modeImgCache = (function () {

    var Count =16;
    var Imgs = new Array(Count);
    var ImgLoaded =0;

    //加载单个图片
    this.downloadImage = function (i)
    {
        var imageIndex = i; //图片以1开始
        Imgs[i].src = "img/mode_bg_"+imageIndex+".png";
        Imgs[i].onLoad=validateImages(i);
    }

    //验证是否成功加载完成,如不成功则重新加载
    function validateImages(i){
        if (!Imgs[i].complete)
        {
            setTimeout('downloadImage('+i+')',200);
        }
        else if (typeof Imgs[i].naturalWidth != "undefined" && Imgs[i].naturalWidth == 0)
        {
            setTimeout('downloadImage('+i+')',200);
        }
        else
        {
            ImgLoaded++
        }
    }
    //预加载图片
    function preLoadImgs()
    {
        for(var i=1;i<=16;i++){
            Imgs[i]=new Image();
            try {
                downloadImage(i);
            }catch (e){
                console.log(e);
            }

        }
    };
    preLoadImgs();
    return Imgs;
})()
</code></pre>

相关文章

  • js中图片预载入与Image()类

    预载入 在android混合开发中,webView的html页面在加载本地的图片的时候,假如图片过大(存储尺寸或者...

  • Vue实现图片预加载

    实现图片的预加载,其实就是用js创建Image对象,然后绑定Image对象的src属性到图片路径,让其实现加载,这...

  • new Iamge()的用法

    用法:1.图片预加载在做游戏时,为了使图片能快打开可以做预加载。原理:创建image对象,将image对象的src...

  • 2018-07-27

    JS实现图片预加载

  • 图片懒加载

    懒加载与预加载的基本概念。 懒加载也叫延迟加载:JS图片延迟加载 延迟加载图片或符合某些条件时才加载某些图片。 预...

  • JS

    JS 懒加载,预加载 概念:懒加载也叫延迟加载:JS图片延迟加载,延迟加载图片或符合某些条件时才加载某些图片。预加...

  • 常用数据结构和函数

    一、图像载入:imread()函数 (1)对于第一个参数,输入需载入图片的路径及文件名:cv::Mat image...

  • ueditor问题

    图片转存:ueditor.all.js 多图上传显示排序:dialogs/image/image.js 上传自定义...

  • canvas图片跨域问题

    最近项目中出现canvas载入远程图片报错跨域问题”Access to Image at 'http://xxxx...

  • 小程序js创建二维码

    wxqrcode.js 不依赖任何类库,可以生成二维码图片base64编码(data:image/gif;base...

网友评论

    本文标题:js中图片预载入与Image()类

    本文链接:https://www.haomeiwen.com/subject/mhseqxtx.html