先介绍一下我的问题出现的环境:
公司用的dwz框架,需求是在一个页面点击,加载一个dialog弹出框,每一个页面都是一个单独的jsp文件:其中在弹出的dialog的那个页面文件中,有下面一段代码:
因为dwz框架的实现机制,就是把当前的代码片段加载到主页面中,所以想给页面中的所有checkbox绑定change事件,发现只能用live绑定事件,而用on绑定事件绑定不上:
$('.checkbox_school').live('change', function() { var schoolInfo = $(this).val(); var schoolInfoObj=eval("("+schoolInfo+")"); //数据字符串转换成对象 if( $(this).attr('checked') && (jQuery.inArray(schoolInfoObj.name,chosenSchoolArr) == -1) ) { //如果这个input被选中,并且在chosenSchoolArr中没有它,就把它存入chosenSchoolArr中,把id存入chosenSchoolIdArr中 chosenSchoolArr.push(schoolInfoObj.name); chosenSchoolIdArr.push(schoolInfoObj.id); }else if( !($(this).attr('checked')) && (jQuery.inArray(schoolInfoObj.name,chosenSchoolArr) != -1) ){ //如果这个input被取消选中,并且在chosenSchoolArr中有它,从数组中删除 chosenSchoolArr.splice(jQuery.inArray(schoolInfoObj.name,chosenSchoolArr),1); chosenSchoolIdArr.splice(jQuery.inArray(schoolInfoObj.id,chosenSchoolIdArr),1); }
if(chosenSchoolArr.length >= 3){ $('.input_school').each(function(){ if(!$(this).attr('checked')) {$(this).attr('disabled','true');} }) }else if(chosenSchoolArr.length < 3){ $('.input_school').each(function(){ $(this).removeAttr('disabled'); }) }
});
以上是背景介绍。
但是在实际的应用中发现原没有那么简单,当我不刷新页面而关闭dialog(弹出框)之后,再打开一次这个dialog(弹出框),代码会被再加载一次,也就是说会再一次绑定这个click事件,当我实际对这checkbox进行点击时,这个点击事件会被执行多次,里面的代码会被执行多次,要解决这个问题,只能在尽量不用live绑定事件或者。
之后我想可不可以在每次执行代码,绑定事件之前把之前绑定的事件给取消绑定?答案是可行的。于是在伟大的度娘的帮助下,发现可以用die()函数取消之前用live绑定的事件。于是起满心欢喜地在这个事件之后,加上了一句:$('.checkbox_school').die('click'); 然后运行测试。。。。果然。。。出错了。
同事说程序员不可能写出没有bug的代码,每天都在创造bug,查找bug,修复bug中度过。
正当我想要放弃,曲线解决问题时,偶然想到jq中的事件是可以连写的,我抱着试试看的态度写了一句:
$('.checkbox_school').die('change').live('change', function() {
//中间代码
})
成功了!
哈哈哈哈!