javascript图片预加载技术

项目开发中时常需要用 JS 判断一张图片是否加载成功,如果图片加载成功,则执行其相应的 onload 绑定事件,

这个就是我们所说的图片预加载技术,先上最终版代码:

 代码如下 复制代码
function loadImage(url, callback) {   
    var img = new Image();   
    img.onload = function () {   
        img.onload = null;   
        callback(img);   
    }   
    img.src = url;   
}

经测试发现 IE6、IE7、IE8:

如果图片已经存于浏览器缓存中,那么再次对该图片发起请求时,浏览器就会直接从缓存中加载,这样就无法触发其 onload 事件。

而在 IE9、Chrome、FireFox:

无论图片是否存于浏览器缓存中,都会触发其 onload 事件。

所以上述代码中我们先要为 img 绑定 onload 事件,再为其赋值 src 地址!

上面的代码我们还可以进行优化,实际中会有一些兼容陷阱,如width与height检测各个浏览器的不一致,还有webkit new Image()建立的图片会受以处在加载进程中同url图片影响,经过反复测试后的最佳处理方式:

 代码如下 复制代码

// 更新:
// 05.27: 1、保证回调执行顺序:error > ready > load;2、回调函数this指向img本身
// 04-02: 1、增加图片完全加载后的回调 2、提高性能

/**
 * 图片头数据加载就绪事件 - 更快获取图片尺寸
 * @version 2011.05.27
 * @author TangBin
  * @param {String} 图片路径
 * @param {Function} 尺寸就绪
 * @param {Function} 加载完毕 (可选)
 * @param {Function} 加载错误 (可选)
 * @example imgReady('hlogo_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);
  };
 };
})();

调用方法

 代码如下 复制代码

imgReady('hlogo_cn.png', function () {
  alert('size ready: width=' + this.width + '; height=' + this.height);
 });

这样性能比第一个要好几十倍,大家不信可测试。

时间: 2024-10-21 11:27:35

javascript图片预加载技术的相关文章

再谈javascript图片预加载技术(详细演示)_javascript技巧

而本文所提到的预加载技术主要是让javascript快速获取图片头部数据的尺寸. 一段典型的使用预加载获取图片大小的例子: 复制代码 代码如下: 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(

javaScript图片预加载后让图片像素变清晰

3. 当客户端请求该图时,4M的原图肯定不会马上下好,特别是远程网络,这时先把小图下过来,并拉升到原图大小(这个操作应该是采用无插值算法的直接放大,速度是很快的.) 应该是存储了好几张不同尺寸不同分辨率的多张图片,当大图片没加载完之前先逐次显示小图片,最后把显示大图片  代码如下 复制代码 <img id="myImage" src="small_1.jpg" width="200" /> var img = new Image();

理解Javascript图片预加载_javascript技巧

预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享三个不同的预加载技术,来增强网站的性能与可用性. 方法一:用CSS和JavaScript实现预加载 实现预加载图片有很多方法,包括使用CSS.JavaScript及两者的各种组合.这些技术可根据不同设计场景设计出相应的解决方案,十分高效.

javascript图片预加载实例分析_javascript技巧

本文实例讲述了javascript图片预加载的方法.分享给大家供大家参考.具体如下: lightbox类效果为了让图片居中显示而使用预加载,需要等待完全加载完毕才能显示,体验不佳(如filick相册的全屏效果).javascript无法获取img文件头数据,真的是这样吗?本文通过一个巧妙的方法让javascript获取它. 这是大部分人使用预加载获取图片大小的例子: var imgLoad = function (url, callback) { var img = new Image(); i

javascript图片预加载完整实例_javascript技巧

本文实例讲述了javascript图片预加载的方法.分享给大家供大家参考,具体如下: <!DOCTYPE > <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title>图片预加载</tit

学习JavaScript图片预加载模块_javascript技巧

前言 在一个应用中,通常会有很多图片,众所周知,加载图片需要时间,在图片没有加载出来之前,页面会是空白,为了提升用户体验,应用的开发人员使出浑身解数,其中最为常见的就是在图片没有加载完成之前,有一个加载动画.这里用到的技术主要是图片预加载.图片预加载的原理并不难,当给一个Image对象设置src属性后,图片就开始加载.给Image对象指定事件要位于设置src属性之前. 涉及到的内容 1.需要预加载的图片并不仅仅只是一张,通常将所有图片的信息保存在一个数组或者对象中,为了加载所有的图片,需要遍历出

再谈javascript图片预加载(lightbox)实现方法

lightbox类效果为了让图片居中显示而使用预加载,需要等待完全加载完毕才能显示,体验不佳(如filick相册的全屏效果).javascript无法获取img文件头数据,真的是这样吗?本文通过一个巧妙的方法让javascript获取它. 这是大部分人使用预加载获取图片大小的例子:  代码如下 复制代码 var imgLoad = function (url, callback) {     var img = new Image();     img.src = url;     if (im

基于javascript实现图片预加载_javascript技巧

一.定义预加载图片是提升用户体验的一个好办法,提前加载用户所需的图片,保证图片快速.无缝发布,使用户在浏览器网站时获得更好用户体验.常用于图片画廊等应用中.[注意]若使用即时加载,加载的图片与页面的其他内容一起加载会增加页面的整体加载时间,所以使用window.onload比较合适.二.两种思路 1.使用背景图像 使用页面无用元素的背景图片预加载 <style> body{ margin: 0; } img{ width: 100px; height: 100px; } ul{ margin:

利用CSS、JavaScript及Ajax实现图片预加载的方法_javascript技巧

预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发布,也可帮助用户在浏览你网站内容时获得更好的用户体验.本文将分享三个不同的预加载技术,来增强网站的性能与可用性. 实现图片预加载可以使用css.JavaScript.Ajax三种方法.下面分别介绍这些方法的实现. 使用CSS 单纯的使用css可以将图片加载到页面元素的背景上,这种方法简单.高效: #d