复选框点击事件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未被设置,那就是说页面未加载完,就会把要执行的函数用一个数组缓存起来,当页面加载完后,再把缓存的函数一一执行