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 相关文章推荐
接收键盘指令的脚本
Jun 26 Javascript
网页中的图片的处理方法与代码
Nov 26 Javascript
JS的参数传递示例介绍
Feb 08 Javascript
使用jQuery管理选择结果
Jan 20 Javascript
JS实现alert中显示换行的方法
Dec 17 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
Aug 10 Javascript
解析vue路由异步组件和懒加载案例
Jun 08 Javascript
JavaScript实现的DOM绘制柱状图效果示例
Aug 08 Javascript
webpack打包非模块化js的方法
Oct 24 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
Dec 11 Javascript
Vue3不支持Filters过滤器的问题
Sep 24 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
Nov 12 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 fsockopen伪造post与get方法的详解
2013/06/14 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
jQuery 入门讲解1
2009/04/15 Javascript
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
JavaScript 以对象为索引的关联数组
2010/05/19 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
Javascript基础教程之break和continue语句
2015/01/18 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
JSON与String互转的实现方法(Javascript)
2016/09/27 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
layui select动态添加option的实例
2018/03/07 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
从Python程序中访问Java类的简单示例
2015/04/20 Python
python使用线程封装的一个简单定时器类实例
2015/05/16 Python
Python实现HTTP协议下的文件下载方法总结
2016/04/20 Python
Python如何实现定时器功能
2020/05/28 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
2020/06/12 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
英国的屈臣氏:Boots博姿
2017/12/23 全球购物
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
连锁酒店店长职责范本
2014/02/13 职场文书
三查三看党性分析材料
2014/02/18 职场文书
入学申请自荐信范文
2014/02/26 职场文书
企业管理标语
2014/06/10 职场文书
应届生求职信范文
2014/06/30 职场文书
食堂管理制度范本
2015/08/04 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS