1、图片加载成功失败的回调。2、图片加载失败的回调。3、纯JavaScript操作,不依赖其他的js文件 /* 该JavaScript文件为懒加载的统一处理工具,包含了图片懒加载的,JavaScript文件异步加载
/* 该JavaScript文件为懒加载的统一处理工具,包含了图片懒加载的,JavaScript文件异步加载处理 图片懒加载加入了 图片加载成功、加载失败的处理操作,执行类名、或者id进行懒加载 */ // ------------------------------- 公共方法 ------------------------------- function cloneObj(oldObj) { //复制对象方法 if (typeof(oldObj) != 'object') return oldObj; if (oldObj == null) return oldObj; var newObj = new Object(); for (var i in oldObj) newObj[i] = cloneObj(oldObj[i]); return newObj; } function extendObj(args) { //扩展对象 if (args.length < 2) return; var temp = cloneObj(args[0]); //调用复制对象方法 for (var n = 1; n < args.length; n++) { for (var i in args[n]) { temp[i] = args[n][i]; } } return temp; } // 获取元素顶部距离 function offsetTop(elements) { var top = elements.offsetTop; var parent = elements.offsetParent; while (parent != null) { top += parent.offsetTop; parent = parent.offsetParent; }; return top; } // 数组的扩展属性 Array.prototype.contains = function(e) { var index = this.indexOf(e); if (index > -1) { return true; } return false; } Array.prototype.remove = function(e) { var index = this.indexOf(e); if (index > -1) { this.splice(index, 1); } } Array.prototype.indexOf = function(val) { for (var i = 0; i < this.length; i++) { if (this[i] == val) return i; } return -1; } function getObjectForId(classId) { var opclass = classId.toString(); if (opclass.indexOf(' ') > -1) { var classArr = opclass.split(' '); var tempArr = []; for (var i = 0; i < classArr.length; i++) { if (classArr[i] != ' ') { tempArr.push(document.getElementById(classArr[i])); } } return tempArr; } else { return document.getElementById(opclass); } } function getObjectForClass(className) { if (className.indexOf(' ') > -1) { var classArr = className.split(' '); var tempArr = []; for (var i = 0; i < classArr.length; i++) { if (classArr[i] != ' ') { var item = document.getElementsByClassName(classArr[i]); for (var j = 0; j < item.length; j++) { tempArr.push(item[j]); } } } return tempArr; } else { return document.getElementsByClassName(className); } } /* ------------------------------- 图片的懒加载处理 ------------------------------- 使用方式:导入当前的JavaScript文件,然后使用 YTImageLazyLoad({}); 如果需要更多参数选择,采用字典作为参数传入。如下 attr:获取实际图片的url success:图片加载完成的回调 failure:图片加载失败的回调 cusImgid:需要进行懒加载的id 多个采用空格分割 cusImgclass:需要进行懒加载的class 多个采用空格分割 默认顺序为先拿id,在拿lass,最后拿img标签 格式模板: YTImageLazyLoad({ success: function(obj, index) { console.log(obj + '加载成功,下标为' + index); }, failure: function(obj, index) { console.log(obj + '加载失败,下标为' + index); }, cusImgid: 'first second', cusImgclass: 'load explame', placeholder: "CommonHTML/LazyLoad/ImgLoading.gif" } ); */ function YTImageLazyLoad(value) { var defaultvalue = { attr: "data-original", success: function(obj, index) {}, // 加载成功的回调 failure: function(obj, index) {}, // 加载失败的回调 cusImgid: null, cusImgclass: null, placeholder:null,// 默认的占位图 }; // 合并下默认参数 var params = extendObj([defaultvalue, value]); // 加载回调 var successcb = function(obj) { if (typeof(params.failure) == 'function') { params.success(obj, loadingImgArr.indexOf(obj)); } }; var failurecb = function(obj) { if(params.placeholder != null) { obj.src = placeholder; } if (typeof(params.failure) == 'function') { params.failure(obj, loadingImgArr.indexOf(obj)); } }; // 存在yt-url值的内容都拿出来 默认顺序为先拿id,在拿lass,最后拿img标签 var urlImages = []; var nodes = []; if (params.cusImgid != null) { nodes = getObjectForId(params.cusImgid); } if (params.cusImgclass != null) { var temparr = getObjectForClass(params.cusImgclass); for (var i = 0; i < temparr.length; i++) { nodes.push(temparr[i]); } } // 没有指定获取那个标签,默认选择img标签 if (nodes.length == 0) { nodes = document.getElementsByTagName('img'); } if (nodes.length == 0) { // alert('没有获取到需要进行懒加载的img标签'); return; } for (var i = 0; i < nodes.length; i++) { if (typeof(nodes[i]) == 'undefined' && nodes[i].getAttribute(params.attr) == null) { return; } if (nodes[i].tagName.toLowerCase() == 'img') { // 只有是img标签才进行处理 urlImages.push(nodes[i]); } } // 加载图片的img标签 var loadingImgArr = []; var loading = function() { for (var i = 0; i < urlImages.length; i++) { var img = urlImages[i]; // 获取父类元素 var a = offsetTop(img); // 需要判断几个条件 1、 是否被隐藏 2、是否在可视区域 3、是否包含在加载的数组中 if (a > document.body.scrollTop && a < (document.body.scrollTop + window.screen.availHeight) && img.style.display != 'none' && loadingImgArr.contains(img) == false) { loadingImgArr.push(img); img.src = img.getAttribute(params.attr); // if (img.complete) { // 如果图片已经存在于浏览器缓存,直接调用回调函数 // successcb(img); // return; // 直接返回,不用再处理onload事件 // } img.onload = function() { successcb(this); } img.onerror = function() { failurecb(this); // 移除元素,下一次滚动可以进行重新加载 loadingImgArr.remove(this); } } } } // 监听滚动时间,并判断当前的urlImages元素是否在可视区域内 window.onscroll = function() { loading(); } // 默认 没有发生滚动行为,调动一次 loading(); } /* JavaScript文件的异步加载 */ // js的加载专用方法,用于加载js文件 function loadJS(src, callback) { var script = document.createElement('script'); var head = document.getElementsByTagName('head')[0]; script.src = src; var loaded; if (typeof callback === 'function') { script.onload = script.onreadystatechange = function() { if (!loaded && (!script.readyState || /loaded|complete/.test(script.readyState))) { script.onload = script.onreadystatechange = null; loaded = true; callback(); } } } head.appendChild(script); }