怎么样实现jQuery的document.ready方法

什么是document.ready?
说document.ready之前,先要讲讲window.onload。我们知道如果在网页头部执行获取或改变dom结构的操作,必须要把相关操作函数放在window.onload当中。为什么需要这样操作呢?看看下面的例子:

<!DOCTYPE HTML>
<html lang="en">
<head>
<script>
var a=document.getElementById("demo");
alert(a);
</script>
</head>
<body>
<div id="demo">DEMO</div>	
</body>
</html>

当我们访问alert(a)时,会弹出null,实际上,这是告诉我们对象没有找到,为什么呢?因为在这句代码执行的时候,后面的DOM结构并没有加载出来,所以我们用document.getElementById找不到这个对象。为了解决这个问题,我们用到了window.onload,onload这个方法是告诉浏览器,在整个HTML文档加载完毕之后执行相关代码,这样以来,就不会出现找不到对象了。

但是问题又来了,我们知道,现代的网页当中不可避免的有图片等其它一些富文本的元素,当网页当中有比较大的图片时候,可能网页的结构已经加载完毕了,但是图片还在下载,这样就导致我们window.onload当中的Javascript代码不能执行。为了能够让js代码在dom加载完之后马上执行,一般有两种方法,第一种是比较简单的,直接把Javascript代码放在HTML标签”“之前。另外一种方法就是用一种方法判断DOM结构已经加载完毕了。第一种方法很简单,就没有什么好说的。关于第二种方法,用过jQuery的都知道它提供一个document.ready()的方法用来监听DOM文档加载完毕的事件。今天的目的就是要实现jQuery的document.ready的方法:

<!DOCTYPE HTML>
<html lang="en">
<head>
<script>
var $=(function(){
var ready=function(callback){
if(document.addEventListener){
	document.addEventListener("DOMContentLoaded",function(){
		document.removeEventListener("DOMContentLoaded",arguments.callee,false);
		callback();
},false);
}else if(document.attachEvent){
	document.attachEvent("onreadystatechange",function(){
		if ( document.readyState === "complete" ) {
			document.detachEvent( "onreadystatechange", arguments.callee );
			callback();
		}
	})
 }
}
return {
ready:ready
}
})()
$.ready(function(){
	alert(document.getElementById("demo").innerHTML);
})
</script>
	</head>
	<body>
		<div id="demo">DEMO</div>
	</body>
</html>

写好“$”这个对象之后,我们就可以通过它提供的方法ready来判断DOM加载完成,然后执行回调函数。主要的原理是通过addEventListener和attachEvent来监听DOM加载的事件,加载完成之后,执行回调函数。
注: addEventListener 支持IE9+(包括IE9)的浏览器,它接受三个参数,第一个为事件类型,第二个为事件处理函数,第三个一般为false。
attachEvent支持IE9之前IE5之后的浏览器,和addEventListener类似,但是只接受两个参数。其它的区别为addEventListener监听的事件类型不用带“on”,但是attachEvent监听的事件需要带”on”.

发表回复