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动态方法调用与参数修改的问题
Dec 10 Javascript
JS清空多文本框、文本域示例代码
Feb 24 Javascript
XML文件转化成NSData对象的方法
Aug 12 Javascript
JavaScript html5 canvas绘制时钟效果
Mar 01 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
Jul 28 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
Jan 05 Javascript
简单实现AngularJS轮播图效果
Apr 10 Javascript
基于bootstrap按钮式下拉菜单组件的搜索建议插件
Mar 25 Javascript
Angular使用Restful的增删改
Dec 28 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
Jun 24 Javascript
layui上传图片到服务器的非项目目录下的方法
Sep 26 Javascript
webpack+vue.js构建前端工程化的详细教程
May 10 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
提升PHP执行速度全攻略(下)
2006/10/09 PHP
php 常用字符串函数总结
2008/03/15 PHP
PHP面向对象学习笔记之一 基础概念
2012/10/06 PHP
PHP批量查询WordPress留言者E-mail地址实现方法
2015/02/15 PHP
php类的定义与继承用法实例
2015/07/07 PHP
php图片添加水印例子
2016/07/20 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
滚动条变色 隐藏滚动条与双击网页自动滚屏显示代码
2009/12/28 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
js实现简单的二级联动效果
2017/03/09 Javascript
解决webpack dev-server不能匹配post请求的问题
2018/08/24 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
基于vue+axios+lrz.js微信端图片压缩上传方法
2019/06/25 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
python在指定目录下查找gif文件的方法
2015/05/04 Python
RC4文件加密的python实现方法
2015/06/30 Python
Python的dict字典结构操作方法学习笔记
2016/05/07 Python
pytorch 查看cuda 版本方式
2020/06/23 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
PyTorch中的拷贝与就地操作详解
2020/12/09 Python
Python wordcloud库安装方法总结
2020/12/31 Python
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
应届毕业生自荐信例文
2014/02/26 职场文书
会计核算科岗位职责
2014/03/19 职场文书
大学生个人先进事迹材料范文
2014/05/03 职场文书
某某同志考察材料
2014/05/28 职场文书
2014教师党员自我评议总结
2014/09/19 职场文书
2014年学生会工作总结
2014/11/07 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
赢在执行观后感
2015/06/16 职场文书
乡镇团代会开幕词
2016/03/04 职场文书