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 相关文章推荐
用于table内容排序
Jul 21 Javascript
浅谈JavaScript Array对象
Dec 29 Javascript
javascript日期验证之输入日期大于等于当前日期
Dec 13 Javascript
深入分析node.js的异步API和其局限性
Sep 05 Javascript
jQuery展示表格点击变色、全选、删除
Jan 05 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
Aug 04 Javascript
vue实现留言板todolist功能
Aug 16 Javascript
vue利用better-scroll实现轮播图与页面滚动详解
Oct 20 Javascript
jquery获取img的src值实例介绍
Jan 16 jQuery
JavaScript刷新页面的几种方法总结
Mar 28 Javascript
详细教你微信公众号正文页SVG交互开发技巧
Jul 25 Javascript
django简单的前后端分离的数据传输实例 axios
May 18 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连接及读取和写入mysql数据库的常用代码
2014/08/11 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
jQuery的实现原理的模拟代码 -2 数据部分
2010/08/01 Javascript
javascript实现文字图片上下滚动的具体实例
2013/06/28 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
Flexigrid在IE下不显示数据的有效处理方法
2014/09/04 Javascript
jQuery中:only-child选择器用法实例
2015/01/03 Javascript
javascript生成随机数方法汇总
2015/11/12 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
微信小程序 Storage API实例详解
2016/10/02 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
nodejs前端自动化构建环境的搭建
2017/07/26 NodeJs
JS中使用media实现响应式布局
2017/08/04 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
python 如何将数据写入本地txt文本文件的实现方法
2019/09/11 Python
详解Python绘图Turtle库
2019/10/12 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
2019/12/03 Python
Python3 实现减少可调用对象的参数个数
2019/12/20 Python
Python作用域与名字空间原理详解
2020/03/21 Python
如何理解Python中的变量
2020/06/01 Python
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
中层竞聘演讲稿
2014/01/09 职场文书
小学生暑假感言
2014/02/06 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
团结演讲稿范文
2014/05/23 职场文书
超市七夕促销活动方案
2014/08/28 职场文书
高中课前三分钟演讲稿
2014/09/13 职场文书
2014年营销工作总结
2014/11/22 职场文书
员工家属慰问信
2015/03/24 职场文书
销售员岗位职责范本
2015/04/11 职场文书
反腐倡廉学习心得体会范文
2015/08/15 职场文书
2016年学校十一国庆节活动总结
2016/04/01 职场文书
关于PHP数组迭代器的使用方法实例
2021/11/17 PHP