javascript瀑布流式图片懒加载实例解析与优化


Posted in Javascript onFebruary 23, 2016

之前写过一版图片“懒加载”的文章,刚好周末在整理文件的时候,大概又看了一遍之前写的代码发现有很多可以优化的地方。
这篇文章主要就是结合上篇《javascript瀑布流式图片懒加载实例》再来看看图片“懒加载”的一些知识。

图片“懒加载”的主旨:
按照需要加载图片,也就是说需要显示的时候再加载图片显示,减少一次性加载的网络带宽开销。

先来看一段代码:

var conf = {
   'loadfirst': true,
   'loadimg': true
  };

  for (var item in conf) {
   if (item in co) {
    conf.item = co.item;
   }
  }

这里我主要是想实现,用户配置和默认配置的合并,这样写代码并不是很优雅,现在使用$.extend来做优化,代码如下:

_this.setting = {
   "mobileHeight": 0, //扩展屏幕的高度,使第一屏加载个数可配置
   "loadNum": 1 //滚动时,当前节点之后加载个数
  };

  $.extend(_this.setting, _this.getSetting());

这里重点介绍下,我新添加的两个参数mobileHeight,loadNum

mobileHeight 默认客户端的高度,值越大,首屏加载的图片越多;

loadNum 如果当前节点出现在屏幕上以后,可以一次性加载当前节点之后的若干个节点,可以跳高图片的加载速度;

之前我的代码是这样子写的:

_this.loadFirstScreen = function() {
   if (conf.loadfirst) {
    lazyNode.each(function(i) {
     currentNodeTop = $(this).offset().top;
     //这里的800就是上面提到的mobileHeight
     if (currentNodeTop < mobileHeight + 800) {
      _this.replaceImgSrc($(this));
     }
    });
   }
  };

_this.loadImg = function() {
   if (conf.loadimg) {
    $(window).on('scroll', function() {
     var imgLazyList = $('[node-type=imglazy]', node);
     //这里的5就是上面提到的loadNum
     for (var i = 0; i < 5; i++) {
      _this.replaceImgSrc(imgLazyList.eq(i));
     }
    });
   }
  };

按照可配置的想法来优化我现在的代码就是下面的这个样子的:

loadFirstSrceen: function() {
   // 加载首屏
   var _this = this;
   var currentNodeTop;
   var imgNodeList = _this.imgNode;
   $(imgNodeList).each(function() {
    currentNodeTop = $(this).offset().top;
    if (currentNodeTop < _this.mobileHeight() + _this.setting.mobileHeight) {
     _this.replaceImgSrc($(this));
    }
   });
  },
  scrollLoadImg: function() {
   //滚动的时候加载图片
   var _this = this;
   var currentNodeTop;
   var scrollTop = $('body').scrollTop();
   var imgLazyList = $('[node-type=imglazy]');

   $(imgLazyList).each(function() {
    currentNodeTop = $(this).offset().top;
    if (currentNodeTop - scrollTop < _this.mobileHeight()) {
     //加载当前节点后的规定个数节点
     for (var i = 0, len = _this.setting.loadNum; i < len; i++) {
      _this.replaceImgSrc($(imgLazyList).eq(i));
     }
     return false;
    }
   });
  }

更重要的一个方面就是按照编写插件的思想来组织现在的代码结构。代码如下:

;(function($) {
 var LoadImgLazy = function(imgNode) {
  var _this = this;
  _this.imgNode = imgNode;

  _this.setting = {
   "mobileHeight": 0, //扩展屏幕的高度,使第一屏加载个数可配置
   "loadNum": 1 //滚动时,当前节点之后加载个数
  };

  $.extend(_this.setting, _this.getSetting());

  _this.loadFirstSrceen();
  $(window).on('scroll', function() {
   _this.scrollLoadImg();
  });


 };

 LoadImgLazy.prototype = {
  mobileHeight: function() {
   return $(window).height();
  },
  loadFirstSrceen: function() {
   // 加载首屏
   var _this = this;
   var currentNodeTop;
   var imgNodeList = _this.imgNode;
   $(imgNodeList).each(function() {
    currentNodeTop = $(this).offset().top;
    if (currentNodeTop < _this.mobileHeight() + _this.setting.mobileHeight) {
     _this.replaceImgSrc($(this));
    }
   });
  },
  scrollLoadImg: function() {
   //滚动的时候加载图片
   var _this = this;
   var currentNodeTop;
   var scrollTop = $('body').scrollTop();
   var imgLazyList = $('[node-type=imglazy]');

   $(imgLazyList).each(function() {
    currentNodeTop = $(this).offset().top;
    if (currentNodeTop - scrollTop < _this.mobileHeight()) {
     //加载当前节点后的规定个数节点
     for (var i = 0, len = _this.setting.loadNum; i < len; i++) {
      _this.replaceImgSrc($(imgLazyList).eq(i));
     }
     return false;
    }
   });
  },
  replaceImgSrc: function(loadImgNode) {
   //动态替换图片
   var srcValue;
   var imgDataSrc;
   var _this = this;
   var imgUrlList = $(loadImgNode).find('img[data-lazysrc]');

   if (imgUrlList.length > 0) {
    imgUrlList.each(function(i) {
     imgDataSrc = $(this).attr('data-lazysrc');
     srcValue = $(this).attr('src');
     if (srcValue === '#') {
      if (imgDataSrc) {
       $(this).attr('src', imgDataSrc);
       $(this).removeAttr('data-lazysrc');
      }
     }
    });
    //移除已经运行过懒加载节点的node-type 对性能提升
    $(loadImgNode).removeAttr('node-type');
   }
  },
  getSetting: function() {
   var userSetting = $('[lazy-setting]').attr('lazy-setting');
   if (userSetting && userSetting !== '') {
    return $.parseJSON(userSetting);
   } else {
    return {};
   }
  },
  destory: function() {
   //销毁方法区
   $(window).off('scroll');
  }
 };

 LoadImgLazy.init = function(imgNode) {
  new this(imgNode);
 };

 window.LoadImgLazy = LoadImgLazy;

})(Zepto);

通过这篇文章希望大家对javascript瀑布流式图片懒加载有了更深的认识,学会优化方法,谢谢大家的阅读。

Javascript 相关文章推荐
window.dialogArguments 使用说明
Apr 11 Javascript
JS 控制小数位数的实现代码
Aug 02 Javascript
jQuery控制输入框只能输入数值的小例子
Mar 20 Javascript
jQuery Easyui快速入门教程
Aug 21 Javascript
实现easyui的datagrid导出为excel的示例代码
Nov 10 Javascript
完美解决IE不支持Data.parse()的问题
Nov 24 Javascript
AngularJS打开页面隐藏显示表达式用法示例
Dec 25 Javascript
详解在vue-cli项目中安装node-sass
Jun 21 Javascript
JS排序算法之希尔排序与快速排序实现方法
Dec 12 Javascript
vuex的简单使用教程
Feb 02 Javascript
js实现九宫格抽奖
Mar 19 Javascript
el-table树形表格表单验证(列表生成序号)
May 31 Javascript
javascript瀑布流式图片懒加载实例
Jun 28 #Javascript
Bootstrap创建可折叠的组件
Feb 23 #Javascript
理解javascript定时器中的setTimeout与setInterval
Feb 23 #Javascript
Web开发必知Javascript技巧大全
Feb 23 #Javascript
JQUERY表单暂存功能插件分享
Feb 23 #Javascript
JavaScript简单实现鼠标移动切换图片的方法
Feb 23 #Javascript
jQuery实现返回顶部功能
Feb 23 #Javascript
You might like
php获取后台Job管理的实现代码
2011/06/10 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
2014/02/13 PHP
PHP实现事件机制的方法
2015/07/10 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
PHP读取文件或采集时解决中文乱码
2021/03/09 PHP
FireFox下XML对象转化成字符串的解决方法
2011/12/09 Javascript
判断是否安装flash player及当前版本的JS代码
2013/08/08 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
vue-cli3单页构建大型项目方案
2020/04/07 Javascript
javascript 内存模型实例详解
2020/04/18 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
vue使用echarts图表自适应的几种解决方案
2020/12/04 Vue.js
vue实现树状表格效果
2020/12/29 Vue.js
Python中几个比较常见的名词解释
2015/07/04 Python
利用python如何在前程无忧高效投递简历
2019/05/07 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
pytorch中的上采样以及各种反操作,求逆操作详解
2020/01/03 Python
python定义类的简单用法
2020/07/24 Python
selenium+python实现基本自动化测试的示例代码
2021/01/27 Python
amazeui模态框弹出后立马消失并刷新页面
2020/08/19 HTML / CSS
介绍一下RMI的基本概念
2016/12/17 面试题
人力资源管理专业应届生求职信
2013/09/28 职场文书
化学教育专业自荐信
2014/07/04 职场文书
小区门卫岗位职责范本
2014/08/24 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
2015年检验科工作总结
2015/04/27 职场文书
python opencv旋转图片的使用方法
2021/06/04 Python
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫
详解Vue3使用axios的配置教程
2022/04/29 Vue.js
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript