JavaScript 中 当用live绑定多个同名事件时,如何移除事件。

    xiaoxiao2021-12-01  20

    先介绍一下我的问题出现的环境:

    公司用的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() {

    //中间代码

    })

    成功了!

    哈哈哈哈!

    转载请注明原文地址: https://ju.6miu.com/read-679372.html

    最新回复(0)