javascript图片预加载完整实例


Posted in Javascript onDecember 10, 2015

本文实例讲述了javascript图片预加载的方法。分享给大家供大家参考,具体如下:

<!DOCTYPE >
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
 <title>图片预加载</title>
</head>
<body>
<img id="song" width="300" src="http://www.baidu.com/img/bdlogo.gif" _src="http://p2009c.zbjimg.com/task/2009-12/03/188273/middlexznxwkia.gif" />
</body>
</html>
<script type="text/javascript">
 //默认图片
 var defurl = 'http://www.baidu.com/img/bdlogo.gif';
 //一张大尺寸图片
 var imgurl = 'http://www.planeart.cn/demo/imgReady/vistas24.jpg';
 //一张gif图片
 var gifurl = 'http://p2009c.zbjimg.com/task/2009-12/03/188273/middlexznxwkia.gif';
 //图片预加载
 function loadImage(url, callback) {
  var img = new Image(); //创建一个Image对象,实现图片的预下载
  img.onload = function(){
   img.onload = null;//gif图片在ie下会循环请求
   callback(img);
  }
  img.src = url;
 }
 var img = document.getElementById('song');
 var url = img.getAttribute('_src')
 loadImage(gifurl,function(){
  //alert('ok');
  img.src = url;
 })
 /**
  * 网络上通用的图片预加载函数
  * @param url
  * @param callback
  */
 var imgLoad = function (url, callback) {
  var img = new Image();
  img.src = url;
  if (img.complete) {
   callback(img.width, img.height);
  } else {
   img.onload = function () {
    callback(img.width, img.height);
    img.onload = null;
   };
  };
 };
 // 更新:
 // 05.27: 1、保证回调执行顺序:error > ready > load;2、回调函数this指向img本身
 // 04-02: 1、增加图片完全加载后的回调 2、提高性能
 /**
  * 图片头数据加载就绪事件 - 更快获取图片尺寸
  *
  * 原理:没有缓存的情况下,用计时器不断验证图片的大小是否发生变化,如果不在变化则为ready
  *  如果有缓存则w3c浏览器会调用 complete,ie则会走 onload,都不在走 计时器那部分
  *
  * @version 2011.05.27
  * @author TangBin
  * @param {String} 图片路径
  * @param {Function} 尺寸就绪
  * @param {Function} 加载完毕 (可选)
  * @param {Function} 加载错误 (可选)
  * @example imgReady('http://www.google.com.hk/intl/zh-CN/images/logo_cn.png', function () {
alert('size ready: width=' + this.width + '; height=' + this.height);
});
  */
 var imgReady = (function () {
  var list = [], intervalId = null,
   // 用来执行队列
   tick = function () {
    var i = 0;
    for (; i < list.length; i++) {
     list[i].end ? list.splice(i--, 1) : list[i]();
    }
    ;
    !list.length && stop();
   },
   // 停止所有定时器队列
   stop = function () {
    clearInterval(intervalId);
    intervalId = null;
   };
  return function (url, ready, load, error) {
   var onready, width, height, newWidth, newHeight,
    img = new Image();
   img.src = url;
   // 如果图片被缓存,则直接返回缓存数据
   if (img.complete) {
    ready.call(img);
    load && load.call(img);
    return;
   }
   ;
   width = img.width;
   height = img.height;
   // 加载错误后的事件
   img.onerror = function () {
    error && error.call(img);
    onready.end = true;
    img = img.onload = img.onerror = null;
   };
   // 图片尺寸就绪
   onready = function () {
    newWidth = img.width;
    newHeight = img.height;
    if (newWidth !== width || newHeight !== height ||
     // 如果图片已经在其他地方加载可使用面积检测
     newWidth * newHeight > 1024
     ) {
     ready.call(img);
     onready.end = true;
    }
    ;
   };
   onready();
   // 完全加载完毕的事件
   img.onload = function () {
     // onload在定时器时间差范围内可能比onready快
    // 这里进行检查并保证onready优先执行
    !onready.end && onready();
    load && load.call(img);
    // IE gif动画会循环执行onload,置空onload即可
    img = img.onload = img.onerror = null;
   };
    // 加入队列中定期执行
   if (!onready.end) {
    list.push(onready);
    // 无论何时只允许出现一个定时器,减少浏览器性能损耗
    if (intervalId === null) intervalId = setInterval(tick, 40);
   }
   ;
  };
 })();
 var img_url = 'http://www.planeart.cn/demo/imgReady/vistas24.jpg';
 imgReady(img_url, function () {
  //console.info(this.width);
  //console.info(this.height);
  alert(this.width + '\n' + this.height);
  document.getElementById('song').src = img_url;
 })
</script>

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript import css实例代码
Jul 18 Javascript
JavaScript 继承详解(三)
Jul 13 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
May 13 Javascript
js无法获取到html标签的属性的解决方法
Jul 26 Javascript
原生js实现新闻列表展开/收起全文功能
Jan 20 Javascript
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
Apr 13 Javascript
详解express + mock让前后台并行开发
Jun 06 Javascript
微信小程序实现自上而下字幕滚动
Jul 14 Javascript
vue缓存的keepalive页面刷新数据的方法
Apr 23 Javascript
vue+element加入签名效果(移动端可用)
Jun 17 Javascript
Javascript中的奇葩知识,你知道吗?
Jan 25 Javascript
javaScript Array api梳理
Mar 31 Javascript
JavaScript动态插入CSS的方法
Dec 10 #Javascript
jQuery实现监控页面所有ajax请求的方法
Dec 10 #Javascript
js表单提交和submit提交的区别实例分析
Dec 10 #Javascript
浅谈javascript中onbeforeunload与onunload事件
Dec 10 #Javascript
详解JavaScript基于面向对象之创建对象(2)
Dec 10 #Javascript
JS提交form表单实例分析
Dec 10 #Javascript
详解JavaScript基于面向对象之创建对象(1)
Dec 10 #Javascript
You might like
《星际争霸II》全新指挥官斯台特曼现已上线
2020/03/08 星际争霸
虫族 Zerg 魔法科技
2020/03/14 星际争霸
[转帖]PHP世纪万年历
2006/12/06 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
PHP查看SSL证书信息的方法
2016/09/22 PHP
使用XHProf查找PHP性能瓶颈的实例
2017/12/13 PHP
基于PHP实现微信小程序客服消息功能
2019/08/12 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
JavaScript 实现??打印?理
2007/04/28 Javascript
javascript跑马灯悬停放大效果实现代码
2012/12/12 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
javascript图片滑动效果实现
2021/01/28 Javascript
JS操作COOKIE实现备忘记录的方法
2016/04/01 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
理解javascript async的用法
2017/08/22 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python重新引入被覆盖的自带function
2014/07/16 Python
python 实现敏感词过滤的方法
2019/01/21 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
2019/07/31 Python
python实现把两个二维array叠加成三维array示例
2019/11/29 Python
Python urllib.request对象案例解析
2020/05/11 Python
使用CSS3来制作消息提醒框
2015/07/12 HTML / CSS
欧洲最大的笔和书写专家:The Pen Shop
2017/03/19 全球购物
什么是Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议
2012/09/06 面试题
我的网上商城创业计划书
2013/12/26 职场文书
消防安全汇报材料
2014/02/08 职场文书
技术总监管理岗位职责
2014/03/09 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
Python中re模块的元字符使用小结
2022/04/07 Python
nginx配置之并发频次限制
2022/04/18 Servers