复选框点击事件JQuery



今天在做一个复选框事件,就是点击一个复选框按钮发生相应的事件的功能时,遇到了一个问题,就是点击之后没有发生预期想要发生的事件,一开始以为是没有监听到,但是检查了好多遍,也确实监听到了,控制台也没有报错,纠结了好久,原来是少写了最外层的一个东西:


$(function(){
	// something code
});

很多用jQ的人都是这么开始写脚本的,但不知道为什么,这样的写法等价于:

$(document).ready(function(){
	// something code
})

意思就是:写在这个方法里的代码需要在DOM加载完成后执行,例子:

<!DOCTYPE html>
<html>
	<head>
		<script type="text/javascript" src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>
		<script>
			$(document).ready(function(){
				$("input[name='zwt']").each(function() {
					var currentEle = $(this);
					currentEle.click(function() {
						if ($("#checkbox1").prop("checked") == true) {
							$("#div1").hide();
						} else {
							$("#div1").show();
						}
						if ($("#checkbox2").prop("checked") == true) {
							$("#div2").hide();
						} else {
							$("#div2").show();
						}
						if ($("#checkbox3").prop("checked") == true) {
							$("#div3").hide();
						} else {
							$("#div3").show();
						}
					});
				});
			});
		</script>
	</head>
	<body>
		<table align="center">
			<tr>
				<td><input type='checkbox' id='checkbox1' name="zwt" />是否隐藏?</td>
				<td>
					<div id='div1'>div111111</div>
				</td>
			</tr>
			<tr>
				<td><input type='checkbox' id='checkbox2' name="zwt" />是否隐藏?</td>
				<td>
					<div id='div2'>div222222</div>
				</td>
			</tr>
			<tr>
				<td><input type='checkbox' id='checkbox3' name="zwt" />是否隐藏?</td>
				<td>
					<div id='div3'>div3333333</div>
				</td>
			</tr>
		</table>
	</body>
</html>

可以简单的理解为$(document).ready(function(){ //something code });里面的代码要在页面渲染完成后运行,不然,以上面的例子,要是不加$(document).ready(function(){ //something code });就会在页面加载完成前去监听点击事件,这时候复选框的勾还没有渲染完成,监听器这时候拿到的是没有打勾的复选框,所以就会执行错误的是事件,等事件执行完后,页面也重新渲染完成了,就造成了没有监听到事件的假象。
与之类似的还有:

$(window).load(function(){
	//something code
});

等价于

window.onload = function()  { 
	//something code
};

最主要的区别是:
1.加载时机不同:
window.onload要等到页面完全加载完成(包括图片)后执行,$(document).ready()只要DOM就绪就会被执行,此时可能页面的关联文件未加载完,例如图片、视屏等多媒体文件,和附件等。
2.执行次数不同:
window.onload只能执行一次,如果第二次,那么第一次的执行会被覆盖,而$(document).ready()可以有多个。
值得注意的是:
在jquery脚本加载的时候,会设置一个isReady的标记,监听DOMContentLoaded事件(这个不是什么浏览器都有的,不同浏览器,jquery运作方式不一样).当然遇到调用ready函数的时候,如果isReady未被设置,那就是说页面未加载完,就会把要执行的函数用一个数组缓存起来,当页面加载完后,再把缓存的函数一一执行