JS网站图片延迟加载
JS网站图片延迟加载
这个兼容性不怎么好
lazyLoad = (function () { var map_element = {}; var element_obj = []; var download_count = 0; var last_offset = -1; var doc_body; var doc_element; var lazy_load_tag; var jj = 0; var kk = 0; function initVar(tags) { doc_body = document.body; //判断是否为IE的"怪异模式" //doc_element = document.compatMode == 'BackCompat' ? doc_body : document.documentElement; doc_element = (document.compatMode && document.compatMode != "CSS1Compat") ? doc_body : document.documentElement; lazy_load_tag = tags || ["img", "iframe"]; }; function initElementMap() { //var all_element = []; //从所有相关元素中找出需要延时加载的元素 for (var i = 0, len = lazy_load_tag.length; i < len; i++) { var el = document.getElementsByTagName(lazy_load_tag[i]); for (var j = 0, len2 = el.length; j < len2; j++) { //yc为要替换的图片地址 if (typeof (el[j]) == "object" && el[j].getAttribute("yc")) { element_obj.push(el[j]); } } } for (var i = 0, len = element_obj.length; i < len; i++) { var o_img = element_obj[i]; var t_index = getAbsoluteTop(o_img); //得到图片相对document的距上距离 if (map_element[t_index]) { map_element[t_index].push(i); } else { //按距上距离保存一个队列 var t_array = []; t_array[0] = i; map_element[t_index] = t_array; download_count++; //需要延时加载的图片数量 } } }; function initDownloadListen() { if (!download_count) return; var loadxz = ''; //var offset = (window.MessageEvent && !document.getBoxObjectFor) ? doc_body.scrollTop : doc_element.scrollTop; /*if(document.compatMode && document.compatMode == "CSS1Compat"){ loadxz = 1; }*/ if(window.MessageEvent && !document.getBoxObjectFor){ if(window.attachEvent){ loadxz = 2; }else{ loadxz = 1; } } var offset = (loadxz == 1) ? doc_body.scrollTop : doc_element.scrollTop; //可视化区域的高=offtset+document的高 var visio_offset = offset + doc_element.clientHeight; if (last_offset == visio_offset) { setTimeout(initDownloadListen, 200);//每隔0.2秒检测一次,这玩意儿感觉有些耗资源的 return; } last_offset = visio_offset; var visio_height = doc_element.clientHeight; var img_show_height = visio_height + offset; for (var key in map_element) { if (img_show_height > key) { var t_o = map_element[key]; var img_vl = t_o.length; for (var l = 0; l < img_vl; l++) { element_obj[t_o[l]].src = element_obj[t_o[l]].getAttribute("yc"); } delete map_element[key]; download_count--; } } setTimeout(initDownloadListen, 200); }; function getAbsoluteTop(element) { if (arguments.length != 1 || element == null) { return null; } var offsetTop = element.offsetTop; while (element = element.offsetParent) { offsetTop += element.offsetTop; } return offsetTop; } function init(tags) { initVar(tags); initElementMap(); initDownloadListen(); }; return { init: init } })();
调用代码:
<script type="text/javascript"> lazyLoad.init(); </script>
这个还行:
/*延时加载*/ function delayload(option){ //读取参数 //图片未加载时显示的图片 var src = option.src ? option.src: '', //指定那些id下的img元素使用延迟显示 id = option.id ? option.id: []; //图片列表 var imgs = []; //获得所有的图片元素 for(var i = 0; i < id.length; i++){ var idbox = document.getElementById(id[i]),_imgs; if (idbox && (_imgs = idbox.getElementsByTagName('img'))){ for (var t = 0; t < _imgs.length; t++) { imgs.push(_imgs[t]); } } } //将所有的图片设置为指定的loading图片 /*for(var i=0 ; i < imgs.length ; i++){ //图片本来的图片路径放入_src中 imgs[i].setAttribute('_src',imgs[i].src); imgs[i].src = src; }*/ //取元素的页面绝对 X位置 var getLeft = function(El){ var left = 0; do{ left += El.offsetLeft; }while((El = El.offsetParent )); return left; }; //取元素的页面绝对 Y位置 var getTop = function(El) { var top = 0; do{ top += El.offsetTop; }while((El = El.offsetParent)); return top; }; //是否为ie,并读出ie版本 var isIE = !!navigator.userAgent.match(/MSIE\b\s*([0-9]\.[0-9]);/img); isIE && (isIE = RegExp.$1); //是否为chrome var isGoo = !!navigator.userAgent.match(/AppleWebKit\b/img); //获得可以触发scroll事件的对象 var box = isIE ? document.documentElement: document; //body元素的scroll事件 var onscroll = box.onscroll = function(){ //读取滚动条的位置和浏览器窗口的显示大小 var top = isGoo ? document.body.scrollTop: document.documentElement.scrollTop, left = isGoo ? document.body.scrollLeft: document.documentElement.scrollLeft, width = document.documentElement.clientWidth, height = document.documentElement.clientHeight; //对所有图片进行批量判断是否在浏览器显示区域内 for(var i = 0; i < imgs.length; i++){ var _top = getTop(imgs[i]), _left = getLeft(imgs[i]); //判断图片是否在显示区域内 if(_top >= top && _left >= left && _top <= top + height && _left <= left + width){ //yc为要替换的图片地址 var _src = imgs[i].getAttribute('yc'); //如果图片已经显示,则取消赋值 if(imgs[i].src !== _src){ imgs[i].src = _src; } } } }; var load = new Image(); load.src = src; load.onload = function(){ onscroll(); }; }
调用代码:
delayload({id:['dginhrml'],src:'img/loading.gif'});
下一篇:jquery常用语句收集
评论列表
发表评论
热评文章
相关阅读