var image = new Image()image.onload = function() { console.log("图片加载完成")}image.src = "http://misc.360buyimg.com/lib/img/e/logo-201305.png"下面推荐几篇网页中实现图片预加载的文章:
<!-- 模板文件 foo.wxml --><view> Hello {{name}}! </view><button bindtap="changeName"> Click me! </button>
//脚本文件 foo.jsPage({ data: { name: "WeChat" }, changeName: function(e) { this.setData({ name: "MINA" }) }})运行这个页面会看到一行 Hello WeChat! 的文字及一个按钮,点击按钮后文字会变成 Hello MINA!
<!-- 模板文件 bar.wxml --><image src="http://misc.360buyimg.com/lib/img/e/logo-201305.png" bindload="imageOnLoad" binderror="imageOnLoadError" />
//脚本文件 bar.jsPage({ imageOnLoad(ev) { console.log(`图片加载成功,width: ${ev.detail.width}; height: ${ev.detail.height}`) }, imageOnLoadError() { console.log("图片加载失败") }})运行以上代码,顺利的话页面上会显示出一张图片,同时控制台会打印出带图片宽高的日志信息
单张图片预加载
完成这个优化操作的关键就在于需要一个公共的图片预加载组件的支持,接下来我们分步骤来看看如何实现
可以看出,由于小程序里无法动态地插入模板结构,所以相对于普通网页端的组件调用,这里多出了在 WXML 文件中引入及使用模板这个步骤,而其他部分对于调用方(即Demo 页面)来说则是相似的,下面是完整的 Demo 页面的代码
<!-- demo.wxml --><view class="img_wrap"> <image wx:if="{{ imgUrl }}" src="{{ imgUrl }}" /></view><button bindtap="loadImage">Click To Load Image</button><view class="msg">{{ msg }}</view><!-- 引入图片预加载组件 --><import src="../../img-loader/img-loader.wxml"/><template is="img-loader" data="{{ imgLoadList }}"></template>
// ------ demo.js ------//引入图片预加载组件const ImgLoader = require("../../img-loader/img-loader.js")//缩略图 80x50 3KBconst imgUrlThumbnail = "http://storage.360buyimg.com/mtd/home/lion1483683731203.jpg"//原图 3200x2000 1.6MBconst imgUrlOriginal = "http://storage.360buyimg.com/mtd/home/lion1483624894660.jpg"Page({ data: { msg: "", imgUrl: "" }, onLoad() { //初始化图片预加载组件 this.imgLoader = new ImgLoader(this) }, loadImage() { //加载缩略图 this.setData({ msg: "大图正拼命加载..", imgUrl: imgUrlThumbnail }) //同时对原图进行预加载,加载成功后再替换 this.imgLoader.load(imgUrlOriginal, (err, data) => { console.log("图片加载完成", err, data.src) this.setData({ msg: "大图加载完成~" }) if (!err) this.setData({ imgUrl: data.src }) }) }})如果把图片加载完成的回调统一指定成 Page 对象中的方法,则可以很方便地处理多张图片的加载,这里也写了个例子,效果如下:
多张图片预加载
总的来说调用起来还算方便吧,img-loader 的组件代码略多这里就不贴出来啦,有兴趣的同学可以前往 Github 项目页面 查看,目前此组件已应用在京东购物小程序版中。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。