lazyload

写了个lazyload,其实以前也写过一个版本,只是感觉太耗资源了,这次重写了一个,优化了一下。目前来说感觉还行吧,等以水平提高了,再继续优化吧。(另:感谢檬檬桑给我提供的domReady函数,相当在天朝这么神奇的国度,不会出现网速极快的情况吧,所以这个函数应该还可以。呵呵,当然你也可以用自己的domReay.)

JS:

function lazyload(){this.init.apply(this,arguments)};

lazyload.prototype = {

	init:function(container,img,defaultImg){

		/*

			参数说明:

			container   :外层框,也可以是window

			img         :需要延时加载的图片的集合

			defaultImg  :默认替换图片

		*/

		var _this = this;

		var doc = document, 

			isWindow = container == window 

						|| container == doc 

						|| !container.tagName

						|| (/^(?:body|html)$/i).test(container.tagName);

		if(isWindow) container = doc.compatMode == 'CSS1Compat' ? doc.documentElement : doc.body;

		this.container = container;

		this.img = img;

		this.items_property = [];

		defaultImg = defaultImg || 'blank.gif';

		//domReady的时候this.items_property里存放每个图片的位置,高宽。

		this.domReady(function(){

			var i=0,len=_this.img.length;

			for(;i<len;i++){

				_this.items_property[i] = {

					t:_this.img[i].offsetTop,

					h:_this.img[i].offsetHeight,

					l:_this.img[i].offsetLeft,

					w:_this.img[i].offsetWidth

				}

				_this.img[i].setAttribute('original',_this.img[i].src);

				_this.img[i].src = defaultImg;

			}

		});

		//用于存放已加载图片的个数,当this.counter等于图片的个数的时候,说明所有的图片都已经加载完毕。

		this.counter = 0;

		//记录外框的属性

		this.container_property = {

			t:this.container.offsetTop,

			l:this.container.offsetLeft,

			h:this.container.clientHeight,

			w:this.container.clientWidth

		}

		this.addEvent(this.container,'scroll',function(){_this.scroll()});

		//如果是window

		isWindow && this.addEvent(window,'scroll',function(){_this.scroll()});

		isWindow && this.addEvent(window,'resize',function(){_this.scroll()});

		/*	

			这个地主用到了 setTimeout其实我自己也很奇怪,

			因为不加setTimeout,上面的this.items_property里没有内容,

			就是说上面的domReady里的for还没有执行。原因我也不知道。

		*/

		setTimeout(function(){_this.scroll();},100)

	},

	

	domReady:function(fn){

		var isIE =!-[1,]

		if (!isIE){ 

			document.addEventListener("DOMContentLoaded", fn, false);

		}else{

			window.setTimeout(fn,0);

		}

	},

	addEvent:function(el,type,fn){

		if(el.addEventListener){

			el.addEventListener(type,fn,false);

		}else if(el.attachEvent){

			el.attachEvent('on'+type,function(){

				fn.call(el,window.event);

			})

		}else{

			el['on'+type] = fn;

		}

	},

	loadImg:function(url,callback){//加载图片

		var img = new Image(),ie = !-[1,];

		img.src = url;

		if(ie){

			img.onreadystatechange = function(){

				if(img.readyState == 'complete') callback(img);

			}

		}else{

			img.onload = function(){

				if(img.complete == true) callback(img);

			}

		}

	},

	hasLoaded:function(img,property){//判断图片是否已经加载

		return img.src == img.getAttribute(property);

	},

	scroll:function(){

		//当所有的图片都已经加载完,直接返回

		if(this.counter == this.img.length) return;

		var _this = this;

		/*

			*这里用到setTimeout的用处有两个

			*一:尽量减少onscroll时的执行次数,从而减少资源消耗

			*二:如果拖动的太快,比如快速将滚动条从最下面拖到最下面,那么中间的那部份是不会被加载的,这很符合情理。因为这个时间

			     里中间那部份并不在可视化范围内。理论上是不应该被加载的。

		*/

		setTimeout(function(){

			var container_pos = {

			st : _this.container.scrollTop,

			sl : _this.container.scrollLeft

			};

			for(var i=0,len=_this.img.length; i<len; i++){

				//当可视化范围内的图片是已经被加载过,那么直接跳到下一次循环

				if(_this.hasLoaded(_this.img[i],'original')) continue;

				_this.t = _this.items_property[i].t - _this.container_property.t - _this.container_property.h;

				_this.b = _this.items_property[i].t + _this.items_property[i].h - _this.container_property.t;

				_this.l = _this.items_property[i].l - _this.container_property.l - _this.container_property.w;

				_this.r = _this.items_property[i].l + _this.items_property[i].w - _this.container_property.l;

				//判断图片是否在可视化范围内,即可以上下,也可以左右。

				if(_this.t < container_pos.st && container_pos.st < _this.b && _this.l < container_pos.sl && container_pos.sl < _this.r){

					(function(i){

						//如果图片在可视化范围内,那么加截该图片,并将记数器累加一次

						_this.loadImg(_this.img[i].getAttribute('original'),function(img){

							_this.img[i].src = img.src;

							_this.counter++;

						})

					})(i);

				}

			}

		},200);

	}

}

HTML:(外框为普通层)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>无标题文档</title>

<style type="text/css">

	#img_box { width:620px; height:500px; overflow:auto; margin:100px auto; border:1px solid #ddd;}

	#img_box ul { list-style:none; padding:0; margin:0;}

	#img_box ul li { margin-bottom:10px;}

	#img_box ul li img { display:block;}

</style>

<script type="text/javascript" src="lazyload_sky.js"></script>

</head>

<body>

<div id="img_box">

<ul>

	<li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse05.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse07.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse08.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse10.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse11.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse12.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse13.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse16.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse17.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse19.jpg" width="600" height="375" /></li>

</ul>

</div>

<script type="text/javascript">

	var box = document.getElementById('img_box'),img = box.getElementsByTagName('img');

	new lazyload(box,img);

</script>

</body>

</html>



HTML:(外框为window)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>无标题文档</title>

<style type="text/css">

	#img_box {width:600px; /* height:500px; */margin:0 auto; border:1px solid #ddd;}

	#img_box ul { list-style:none; padding:0; margin:0;}

	#img_box ul li { margin-bottom:10px;}

	#img_box ul li img { display:block;}

</style>

<script type="text/javascript" src="lazyload_sky.js"></script>

</head>

<body>

<div id="img_box">

<ul>

	<li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse05.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse07.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse08.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse10.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse11.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse12.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse13.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse16.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse17.jpg" width="600" height="375" /></li>

    <li><img src="http://img.article.pchome.net/new/w600/00/36/63/99//pic_lib/wm/Lengse19.jpg" width="600" height="375" /></li>

</ul>

</div>

<script type="text/javascript">

	var img = document.getElementById('img_box').getElementsByTagName('img');

	new lazyload(document,img);

</script>

</body>

</html>



你可能感兴趣的:(lazyload)