网页图片预加载

正常情况下,网页加载图片会从上到下像"瀑布"一样加载出来,而预加载就是等所有图片加载完毕后一次性将图片显示出来,提高了页面加载速度与用户体验。
如果页面使用了在用户交互后才显示的图片,有必要进行预加载:

$.preloadImages = function () {
  for (var i = 0; i < arguments.length; i++) {
    $('img').attr('src', arguments[i]);
  }
};
$.preloadImages('img/hover-on.png', 'img/hover-off.png');

当页面加载大量图片时经?;岢鱿职滓?,我们可以提高服务器性能,使用静态缓存等手段来加快图片加载速度;下面介绍一种在实际应用中经常用到的js预加载方法:在图片标签处做处理<image data="图片实际地址" src="占位图" alt="图片名" />

$('img[data]').load(function() { 
  var __this__ = $(this); 
  var url = __this__.attr('data'); 
  var src = __this__.attr('src'); 
  // 如果图片地址不存在或者已经加载,不做处理
  if (url ==''|| url == src) { 
    return; 
  } 
  var img =newImage();
  // 加载将要显示的图片 
  img.src = url;
  // 如果图片已经加载到缓存,直接处理
  if(img.complete) { 
    // 替换将要显示的图片
    __this__.attr('src',url);
    return; 
  } 
  // 图片加载完成再做处理 
  img.onload =function() {
    __this__.attr('src',url); 
  } 
});

如果需要在页面初始加载时显示加载进度,在图片很多的情况下可以使用第三方插件jquery.imgpreload.min.js如下

// 在全局范围内改变或重写默认设置的imgpreload方法
$.fn.imgpreload.defaults =
{
    each: null // callback invoked when each image is loaded
    , all: null // callback invoked when all images have loaded
};
// 在标签加载完成后预加载图片
$('#content img').imgpreload(function() {
    // callback invoked when all images have loaded
    // this = array of dom image objects
    // check for success with: $(this[i]).data('loaded')
});
$('img.logos').imgpreload ({
    each: function()
    {
        // callback invoked when each image is loaded
        // this = dom image object
        // check for success with: $(this).data('loaded')
    },
    all: function()
    {
        // callback invoked when all images have loaded
        // this = array of dom image objects
        // check for success with: $(this[i]).data('loaded')
    }
});
// 在标签加载前预加载图片,在文档头部必须使用特定路径
$.imgpreload('/images/a.gif',function()
{
    // callback invoked when all images have loaded
    // this = array of dom image objects
    // check for success with: $(this[i]).data('loaded')
});
$.imgpreload(['/images/a.gif','/images/b.gif'],function()
{
    // this = array of dom image objects
    // check for success with: $(this[i]).data('loaded')
    // callback executes when all images are loaded
});
$.imgpreload(['/images/a.gif','/images/b.gif'],
{
    each: function()
    {
        // callback invoked when each image is loaded
        // this = dom image object
        // check for success with: $(this).data('loaded')
    },
    all: function()
    {
        // callback invoked when all images have loaded
        // this = array of dom image objects
        // check for success with: $(this[i]).data('loaded')
    }
});

jquery.imgpreload的实际使用有两种方式如下

var imgNum = 0;
var images = [];
$(function(){ 
  preloadImg(); 
});
 
function preLoadImg() {
  // 第一种方式:获取页面中所有img,包括<img>标签和css中的background-image;
  var imgs = document.images;
  for (var i = 0; i < imgs.length; i++) {
    images.push(imgs[i].src);
  }
  var cssImages = getallBgimages();
  for (var j = 0; j < cssImages.length; j++) {
    images.push(cssImages[j]);
  }*/

  // 第二种方式:把所有网页图片文件预先放入一个数组里;
  $.imgpreload(['images/bg1.jpg', 'images/bg2.jpg'], function () {
    //此处是显示进度百分比时需要用到的背景图,这个可以先加载进去
  });
  //then push all other images in array to load 
  images.push("images/test_1.png");
  images.push("images/test_2.png");
  images.push("images/test_3.png");
  images.push("images/test_n.png"); 
 
  $.imgpreload(images, {
    each: function () {
    /*this will be called after each image loaded*/
    var status = $(this).data('loaded') ? 'success' : 'error';
    if (status == "success") {    
      var v = (parseFloat(++imgNum) / images.length).toFixed(2);
      $("#percentShow").html(Math.round(v * 100) + "<sup>%</sup>");    
    }
  },
  all: function () {
   /*this will be called after all images loaded*/
   $("#percentShow ").html("100<sup>%</sup>");
 
   $("percentShow").fadeOut(1000);   
   $(".main").show();
  }
  });
}

// 该方式引用自其它博客,仅供借鉴
function getallBgimages() {
  var url, B = [], A = document.getElementsByTagName('*');
  A = B.slice.call(A, 0, A.length);
  while (A.length) {
    url = document.deepCss(A.shift(), 'background-image');
    if (url) url = /url\(['']?([^")]+)/.exec(url) || [];
    url = url[1];
    if (url && B.indexOf(url) == -1) B[B.length] = url;
  }
  return B;
}
 
document.deepCss = function (who, css) {
  if (!who || !who.style) return '';
  var sty = css.replace(/\-([a-z])/g, function (a, b) {
    return b.toUpperCase();
  });
  if (who.currentStyle) {
    return who.style[sty] || who.currentStyle[sty] || '';
  }
  var dv = document.defaultView || window;
  return who.style[sty] ||
  dv.getComputedStyle(who, "").getPropertyValue(css) || '';
}
 
Array.prototype.indexOf = Array.prototype.indexOf ||
  function (what, index) {
    index = index || 0;
    var L = this.length;
    while (index < L) {
    if (this[index] === what) return index;
    ++index;
  }
  return -1;
}
最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容