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 相关文章推荐
瀑布流布局代码一例
Apr 11 Javascript
javascript实现详细时间提醒信息效果的方法
Mar 11 Javascript
javascript中JSON对象与JSON字符串相互转换实例
Jul 11 Javascript
JavaScript中的this机制
Jan 30 Javascript
js实现楼层效果的简单实例
Jul 15 Javascript
js本地图片预览实现代码
Oct 09 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
Mar 21 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
Aug 17 jQuery
基于vue的换肤功能的示例代码
Oct 10 Javascript
react-router browserHistory刷新页面404问题解决方法
Dec 29 Javascript
Vue.js实现的计算器功能完整示例
Jul 11 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
Nov 14 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/12/06 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
2017/04/09 PHP
php获取微信共享收货地址的方法
2017/12/21 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
js实现全屏漂浮广告移入光标停止移动
2013/12/02 Javascript
jquery表单验证插件(jquery.validate.js)的3种使用方式
2015/03/28 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
2016/04/26 Javascript
jquery动态添加文本并获取值的方法
2016/10/12 Javascript
React中上传图片到七牛的示例代码
2017/10/10 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
vue.js基于v-for实现批量渲染 Json数组对象列表数据示例
2019/08/03 Javascript
java和js实现的洗牌小程序
2019/09/30 Javascript
[58:37]Serenity vs Fnatic 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
web.py获取上传文件名的正确方法
2014/08/26 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
配置 Pycharm 默认 Test runner 的图文教程
2018/11/30 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
2019/06/04 Python
Python初学者常见错误详解
2019/07/02 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
2019/07/23 Python
解决django 新增加用户信息出现错误的问题
2019/07/28 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
波兰数码相机及配件网上商店: Cyfrowe.pl
2017/06/19 全球购物
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
Ajax的工作原理
2015/12/04 面试题
2014年五四青年节演讲稿范文
2014/04/22 职场文书
2014年入党积极分子学习三中全会思想汇报
2014/09/13 职场文书
研究生导师评语
2014/12/31 职场文书
2016年先进教师个人事迹材料
2016/02/26 职场文书
在python中实现导入一个需要传参的模块
2021/05/12 Python
Nginx防盗链与服务优化配置的全过程
2022/01/18 Servers
Java 数组的使用
2022/05/11 Java/Android